Skip to content

Commit a96f06e

Browse files
uttam12331auvipy
authored andcommitted
Honor the delivery_mode argument in Exchange.Message
Exchange.Message accepts a delivery_mode argument and documents it as 'Set custom delivery mode. Defaults to :attr:delivery_mode', but the body always used self.delivery_mode, so the caller's value was discarded. Asking for a transient message on a persistent exchange still produced delivery_mode=2, and vice versa. Fall back to the exchange default only when no delivery mode is given, matching Producer._delivery_details, which already does 'delivery_mode or exchange.delivery_mode'. Exchange.publish() passes no delivery mode, so its behaviour is unchanged.
1 parent 4281680 commit a96f06e

2 files changed

Lines changed: 16 additions & 1 deletion

File tree

kombu/entity.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,8 @@ def Message(self, body, delivery_mode=None, properties=None, **kwargs):
249249
headers (Dict): Message headers.
250250
"""
251251
properties = {} if properties is None else properties
252-
properties['delivery_mode'] = maybe_delivery_mode(self.delivery_mode)
252+
properties['delivery_mode'] = maybe_delivery_mode(
253+
delivery_mode or self.delivery_mode)
253254
if (isinstance(body, str) and
254255
properties.get('content_encoding', None)) is None:
255256
kwargs['content_encoding'] = 'utf-8'

t/unit/test_entity.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,20 @@ def test_create_message(self) -> None:
148148
Exchange('foo', channel=chan).Message({'foo': 'bar'})
149149
assert 'prepare_message' in chan
150150

151+
def test_create_message_delivery_mode(self) -> None:
152+
chan = get_conn().channel()
153+
exchange = Exchange('foo', channel=chan, delivery_mode='persistent')
154+
155+
# an explicit delivery_mode overrides the exchange default
156+
message = exchange.Message({'foo': 'bar'}, delivery_mode='transient')
157+
assert message['properties']['delivery_mode'] == \
158+
Exchange.TRANSIENT_DELIVERY_MODE
159+
160+
# without one, the exchange default is used
161+
message = exchange.Message({'foo': 'bar'})
162+
assert message['properties']['delivery_mode'] == \
163+
Exchange.PERSISTENT_DELIVERY_MODE
164+
151165
def test_publish(self) -> None:
152166
chan = get_conn().channel()
153167
Exchange('foo', channel=chan).publish('the quick brown fox')

0 commit comments

Comments
 (0)