@@ -79,8 +79,8 @@ class Connection
79
79
* * flags: Exchange flags (Default: AMQP_DURABLE)
80
80
* * arguments: Extra arguments
81
81
* * delay:
82
- * * routing_key_pattern: The pattern of the routing key (Default: "delay_%delay%")
83
- * * queue_name_pattern: Pattern to use to create the queues (Default: "delay_queue_%delay%")
82
+ * * routing_key_pattern: The pattern of the routing key (Default: "delay_%routing_key%_% delay%")
83
+ * * queue_name_pattern: Pattern to use to create the queues (Default: "delay_queue_%routing_key%_% delay%")
84
84
* * exchange_name: Name of the exchange to be used for the retried messages (Default: "retry")
85
85
* * auto_setup: Enable or not the auto-setup of queues and exchanges (Default: true)
86
86
* * loop_sleep: Amount of micro-seconds to wait if no message are available (Default: 200000)
@@ -90,9 +90,9 @@ public function __construct(array $connectionOptions, array $exchangeOptions, ar
90
90
{
91
91
$ this ->connectionOptions = array_replace_recursive ([
92
92
'delay ' => [
93
- 'routing_key_pattern ' => 'delay_%delay% ' ,
93
+ 'routing_key_pattern ' => 'delay_%routing_key%_% delay% ' ,
94
94
'exchange_name ' => 'delay ' ,
95
- 'queue_name_pattern ' => 'delay_queue_%delay% ' ,
95
+ 'queue_name_pattern ' => 'delay_queue_%routing_key%_% delay% ' ,
96
96
],
97
97
], $ connectionOptions );
98
98
$ this ->exchangeOptions = $ exchangeOptions ;
@@ -186,7 +186,7 @@ public function publish(string $body, array $headers = [], int $delay = 0, AmqpS
186
186
$ this ->publishOnExchange (
187
187
$ this ->exchange (),
188
188
$ body ,
189
- ( null !== $ amqpStamp ? $ amqpStamp -> getRoutingKey () : null ) ?? $ this ->getDefaultPublishRoutingKey ( ),
189
+ $ this ->getRoutingKeyForMessage ( $ amqpStamp ),
190
190
[
191
191
'headers ' => $ headers ,
192
192
],
@@ -209,14 +209,16 @@ public function countMessagesInQueues(): int
209
209
*/
210
210
private function publishWithDelay (string $ body , array $ headers , int $ delay , AmqpStamp $ amqpStamp = null )
211
211
{
212
+ $ routingKey = $ this ->getRoutingKeyForMessage ($ amqpStamp );
213
+
212
214
if ($ this ->shouldSetup ()) {
213
- $ this ->setupDelay ($ delay , null !== $ amqpStamp ? $ amqpStamp -> getRoutingKey () : null );
215
+ $ this ->setupDelay ($ delay , $ routingKey );
214
216
}
215
217
216
218
$ this ->publishOnExchange (
217
219
$ this ->getDelayExchange (),
218
220
$ body ,
219
- $ this ->getRoutingKeyForDelay ($ delay ),
221
+ $ this ->getRoutingKeyForDelay ($ delay, $ routingKey ),
220
222
[
221
223
'headers ' => $ headers ,
222
224
],
@@ -245,7 +247,7 @@ private function setupDelay(int $delay, ?string $routingKey)
245
247
246
248
$ queue = $ this ->createDelayQueue ($ delay , $ routingKey );
247
249
$ queue ->declareQueue ();
248
- $ queue ->bind ($ exchange ->getName (), $ this ->getRoutingKeyForDelay ($ delay ));
250
+ $ queue ->bind ($ exchange ->getName (), $ this ->getRoutingKeyForDelay ($ delay, $ routingKey ));
249
251
}
250
252
251
253
private function getDelayExchange (): \AMQPExchange
@@ -271,13 +273,16 @@ private function getDelayExchange(): \AMQPExchange
271
273
private function createDelayQueue (int $ delay , ?string $ routingKey )
272
274
{
273
275
$ queue = $ this ->amqpFactory ->createQueue ($ this ->channel ());
274
- $ queue ->setName (str_replace ('%delay% ' , $ delay , $ this ->connectionOptions ['delay ' ]['queue_name_pattern ' ]));
276
+ $ queue ->setName (str_replace (
277
+ ['%delay% ' , '%routing_key% ' ],
278
+ [$ delay , $ routingKey ?: 'no_routing_key ' ],
279
+ $ this ->connectionOptions ['delay ' ]['queue_name_pattern ' ]
280
+ ));
275
281
$ queue ->setArguments ([
276
282
'x-message-ttl ' => $ delay ,
277
283
'x-dead-letter-exchange ' => $ this ->exchange ()->getName (),
278
284
]);
279
285
280
- $ routingKey = $ routingKey ?? $ this ->getDefaultPublishRoutingKey ();
281
286
if (null !== $ routingKey ) {
282
287
// after being released from to DLX, this routing key will be used
283
288
$ queue ->setArgument ('x-dead-letter-routing-key ' , $ routingKey );
@@ -286,9 +291,13 @@ private function createDelayQueue(int $delay, ?string $routingKey)
286
291
return $ queue ;
287
292
}
288
293
289
- private function getRoutingKeyForDelay (int $ delay ): string
294
+ private function getRoutingKeyForDelay (int $ delay, ? string $ finalRoutingKey ): string
290
295
{
291
- return str_replace ('%delay% ' , $ delay , $ this ->connectionOptions ['delay ' ]['routing_key_pattern ' ]);
296
+ return str_replace (
297
+ ['%delay% ' , '%routing_key% ' ],
298
+ [$ delay , $ finalRoutingKey ?: 'no_routing_key ' ],
299
+ $ this ->connectionOptions ['delay ' ]['routing_key_pattern ' ]
300
+ );
292
301
}
293
302
294
303
/**
@@ -444,4 +453,9 @@ public function purgeQueues()
444
453
$ this ->queue ($ queueName )->purge ();
445
454
}
446
455
}
456
+
457
+ private function getRoutingKeyForMessage (?AmqpStamp $ amqpStamp ): ?string
458
+ {
459
+ return (null !== $ amqpStamp ? $ amqpStamp ->getRoutingKey () : null ) ?? $ this ->getDefaultPublishRoutingKey ();
460
+ }
447
461
}
0 commit comments