2020import reactor .rabbitmq .BindingSpecification ;
2121import reactor .rabbitmq .ExchangeSpecification ;
2222
23- import java .util .Objects ;
2423import java .util .Optional ;
25- import java .util .Set ;
2624import java .util .function .Function ;
27- import java .util .stream .Collectors ;
2825
26+ import static java .lang .String .format ;
2927import static reactor .core .publisher .Flux .fromIterable ;
3028
3129@ Log
@@ -38,6 +36,7 @@ public class ApplicationEventListener extends GenericMessageListener {
3836 private final int retryDelay ;
3937 private final Optional <Integer > maxLengthBytes ;
4038 private final Matcher keyMatcher ;
39+ private final String appName ;
4140
4241
4342 public ApplicationEventListener (ReactiveMessageListener receiver ,
@@ -49,7 +48,8 @@ public ApplicationEventListener(ReactiveMessageListener receiver,
4948 long maxRetries , int retryDelay ,
5049 Optional <Integer > maxLengthBytes ,
5150 DiscardNotifier discardNotifier ,
52- CustomErrorReporter errorReporter ) {
51+ CustomErrorReporter errorReporter ,
52+ String appName ) {
5353 super (queueName , receiver , withDLQRetry , maxRetries , discardNotifier , "event" , errorReporter );
5454 this .retryDelay = retryDelay ;
5555 this .withDLQRetry = withDLQRetry ;
@@ -58,17 +58,22 @@ public ApplicationEventListener(ReactiveMessageListener receiver,
5858 this .messageConverter = messageConverter ;
5959 this .maxLengthBytes = maxLengthBytes ;
6060 this .keyMatcher = new KeyMatcher ();
61+ this .appName = appName ;
6162 }
6263
6364 protected Mono <Void > setUpBindings (TopologyCreator creator ) {
6465 if (withDLQRetry ) {
66+ final String eventsDLQExchangeName = format ("%s.%s.DLQ" , appName , eventsExchange );
67+ final String retryExchangeName = format ("%s.%s" , appName , eventsExchange );
6568 final Mono <AMQP .Exchange .DeclareOk > declareExchange = creator .declare (ExchangeSpecification .exchange (eventsExchange ).durable (true ).type ("topic" ));
66- final Mono <AMQP .Exchange .DeclareOk > declareExchangeDLQ = creator .declare (ExchangeSpecification .exchange (eventsExchange + ".DLQ" ).durable (true ).type ("topic" ));
67- final Mono <AMQP .Queue .DeclareOk > declareDLQ = creator .declareDLQ (queueName , eventsExchange , retryDelay , maxLengthBytes );
68- final Mono <AMQP .Queue .DeclareOk > declareQueue = creator .declareQueue (queueName , eventsExchange + ".DLQ" , maxLengthBytes );
69+ final Mono <AMQP .Exchange .DeclareOk > retryExchange = creator .declare (ExchangeSpecification .exchange (retryExchangeName ).durable (true ).type ("topic" ));
70+ final Mono <AMQP .Exchange .DeclareOk > declareExchangeDLQ = creator .declare (ExchangeSpecification .exchange (eventsDLQExchangeName ).durable (true ).type ("topic" ));
71+ final Mono <AMQP .Queue .DeclareOk > declareDLQ = creator .declareDLQ (queueName , retryExchangeName , retryDelay , maxLengthBytes );
72+ final Mono <AMQP .Queue .DeclareOk > declareQueue = creator .declareQueue (queueName , eventsDLQExchangeName , maxLengthBytes );
6973 final Flux <AMQP .Queue .BindOk > bindings = fromIterable (resolver .getEventListeners ()).flatMap (listener -> creator .bind (BindingSpecification .binding (eventsExchange , listener .getPath (), queueName )));
70- final Flux <AMQP .Queue .BindOk > bindingDLQ = fromIterable (resolver .getEventListeners ()).flatMap (listener -> creator .bind (BindingSpecification .binding (eventsExchange + ".DLQ" , listener .getPath (), queueName + ".DLQ" )));
71- return declareExchange .then (declareExchangeDLQ ).then (declareQueue ).then (declareDLQ ).thenMany (bindings ).thenMany (bindingDLQ ).then ();
74+ final Mono <AMQP .Queue .BindOk > bindingDLQ = creator .bind (BindingSpecification .binding (eventsDLQExchangeName , "#" , queueName + ".DLQ" ));
75+ final Mono <AMQP .Queue .BindOk > retryBinding = creator .bind (BindingSpecification .binding (retryExchangeName , "#" , queueName ));
76+ return declareExchange .then (retryExchange ).then (declareExchangeDLQ ).then (declareQueue ).then (declareDLQ ).thenMany (bindings ).then (bindingDLQ ).then (retryBinding ).then ();
7277 } else {
7378 final Flux <AMQP .Queue .BindOk > bindings = fromIterable (resolver .getEventListeners ())
7479 .flatMap (listener -> creator .bind (BindingSpecification .binding (eventsExchange , listener .getPath (), queueName )));
0 commit comments