41
41
import org .springframework .amqp .core .Base64UrlNamingStrategy ;
42
42
import org .springframework .amqp .core .Binding ;
43
43
import org .springframework .amqp .core .Binding .DestinationType ;
44
+ import org .springframework .amqp .core .Declarable ;
44
45
import org .springframework .amqp .core .ExchangeBuilder ;
45
46
import org .springframework .amqp .core .ExchangeTypes ;
46
47
import org .springframework .amqp .core .Queue ;
@@ -362,11 +363,12 @@ private void processMultiMethodListeners(RabbitListener[] classLevelListeners, M
362
363
}
363
364
}
364
365
365
- protected void processAmqpListener (RabbitListener rabbitListener , Method method , Object bean , String beanName ) {
366
+ protected Collection <Declarable > processAmqpListener (RabbitListener rabbitListener , Method method , Object bean ,
367
+ String beanName ) {
366
368
Method methodToUse = checkProxy (method , bean );
367
369
MethodRabbitListenerEndpoint endpoint = new MethodRabbitListenerEndpoint ();
368
370
endpoint .setMethod (methodToUse );
369
- processListener (endpoint , rabbitListener , bean , methodToUse , beanName );
371
+ return processListener (endpoint , rabbitListener , bean , methodToUse , beanName );
370
372
}
371
373
372
374
private Method checkProxy (Method methodArg , Object bean ) {
@@ -401,13 +403,14 @@ private Method checkProxy(Method methodArg, Object bean) {
401
403
return method ;
402
404
}
403
405
404
- protected void processListener (MethodRabbitListenerEndpoint endpoint , RabbitListener rabbitListener , Object bean ,
405
- Object target , String beanName ) {
406
+ protected Collection < Declarable > processListener (MethodRabbitListenerEndpoint endpoint ,
407
+ RabbitListener rabbitListener , Object bean , Object target , String beanName ) {
406
408
409
+ final List <Declarable > declarables = new ArrayList <>();
407
410
endpoint .setBean (bean );
408
411
endpoint .setMessageHandlerMethodFactory (this .messageHandlerMethodFactory );
409
412
endpoint .setId (getEndpointId (rabbitListener ));
410
- endpoint .setQueueNames (resolveQueues (rabbitListener ));
413
+ endpoint .setQueueNames (resolveQueues (rabbitListener , declarables ));
411
414
endpoint .setConcurrency (resolveExpressionAsStringOrInteger (rabbitListener .concurrency (), "concurrency" ));
412
415
endpoint .setBeanFactory (this .beanFactory );
413
416
endpoint .setReturnExceptions (resolveExpressionAsBoolean (rabbitListener .returnExceptions ()));
@@ -456,6 +459,7 @@ else if (errorHandler instanceof String) {
456
459
RabbitListenerContainerFactory <?> factory = resolveContainerFactory (rabbitListener , target , beanName );
457
460
458
461
this .registrar .registerEndpoint (endpoint , factory );
462
+ return declarables ;
459
463
}
460
464
461
465
private void resolveAckMode (MethodRabbitListenerEndpoint endpoint , RabbitListener rabbitListener ) {
@@ -562,7 +566,7 @@ private String getEndpointId(RabbitListener rabbitListener) {
562
566
}
563
567
}
564
568
565
- private String [] resolveQueues (RabbitListener rabbitListener ) {
569
+ private String [] resolveQueues (RabbitListener rabbitListener , Collection < Declarable > declarables ) {
566
570
String [] queues = rabbitListener .queues ();
567
571
QueueBinding [] bindings = rabbitListener .bindings ();
568
572
org .springframework .amqp .rabbit .annotation .Queue [] queuesToDeclare = rabbitListener .queuesToDeclare ();
@@ -578,15 +582,15 @@ private String[] resolveQueues(RabbitListener rabbitListener) {
578
582
"@RabbitListener can have only one of 'queues', 'queuesToDeclare', or 'bindings'" );
579
583
}
580
584
for (int i = 0 ; i < queuesToDeclare .length ; i ++) {
581
- result .add (declareQueue (queuesToDeclare [i ]));
585
+ result .add (declareQueue (queuesToDeclare [i ], declarables ));
582
586
}
583
587
}
584
588
if (bindings .length > 0 ) {
585
589
if (queues .length > 0 || queuesToDeclare .length > 0 ) {
586
590
throw new BeanInitializationException (
587
591
"@RabbitListener can have only one of 'queues', 'queuesToDeclare', or 'bindings'" );
588
592
}
589
- return registerBeansForDeclaration (rabbitListener );
593
+ return registerBeansForDeclaration (rabbitListener , declarables );
590
594
}
591
595
return result .toArray (new String [result .size ()]);
592
596
}
@@ -618,19 +622,20 @@ else if (resolvedValueToUse instanceof Iterable) {
618
622
}
619
623
}
620
624
621
- private String [] registerBeansForDeclaration (RabbitListener rabbitListener ) {
625
+ private String [] registerBeansForDeclaration (RabbitListener rabbitListener , Collection < Declarable > declarables ) {
622
626
List <String > queues = new ArrayList <String >();
623
627
if (this .beanFactory instanceof ConfigurableBeanFactory ) {
624
628
for (QueueBinding binding : rabbitListener .bindings ()) {
625
- String queueName = declareQueue (binding .value ());
629
+ String queueName = declareQueue (binding .value (), declarables );
626
630
queues .add (queueName );
627
- declareExchangeAndBinding (binding , queueName );
631
+ declareExchangeAndBinding (binding , queueName , declarables );
628
632
}
629
633
}
630
634
return queues .toArray (new String [queues .size ()]);
631
635
}
632
636
633
- private String declareQueue (org .springframework .amqp .rabbit .annotation .Queue bindingQueue ) {
637
+ private String declareQueue (org .springframework .amqp .rabbit .annotation .Queue bindingQueue ,
638
+ Collection <Declarable > declarables ) {
634
639
String queueName = (String ) resolveExpression (bindingQueue .value ());
635
640
boolean isAnonymous = false ;
636
641
if (!StringUtils .hasText (queueName )) {
@@ -649,10 +654,11 @@ private String declareQueue(org.springframework.amqp.rabbit.annotation.Queue bin
649
654
queue .setAdminsThatShouldDeclare ((Object []) bindingQueue .admins ());
650
655
}
651
656
queue .setShouldDeclare (resolveExpressionAsBoolean (bindingQueue .declare ()));
657
+ declarables .add (queue );
652
658
return queueName ;
653
659
}
654
660
655
- private void declareExchangeAndBinding (QueueBinding binding , String queueName ) {
661
+ private void declareExchangeAndBinding (QueueBinding binding , String queueName , Collection < Declarable > declarables ) {
656
662
org .springframework .amqp .rabbit .annotation .Exchange bindingExchange = binding .exchange ();
657
663
String exchangeName = resolveExpressionAsString (bindingExchange .value (), "@Exchange.exchange" );
658
664
Assert .isTrue (StringUtils .hasText (exchangeName ), () -> "Exchange name required; binding queue " + queueName );
@@ -697,10 +703,12 @@ private void declareExchangeAndBinding(QueueBinding binding, String queueName) {
697
703
698
704
((ConfigurableBeanFactory ) this .beanFactory )
699
705
.registerSingleton (exchangeName + ++this .increment , exchange );
700
- registerBindings (binding , queueName , exchangeName , exchangeType );
706
+ registerBindings (binding , queueName , exchangeName , exchangeType , declarables );
707
+ declarables .add (exchange );
701
708
}
702
709
703
- private void registerBindings (QueueBinding binding , String queueName , String exchangeName , String exchangeType ) {
710
+ private void registerBindings (QueueBinding binding , String queueName , String exchangeName , String exchangeType ,
711
+ Collection <Declarable > declarables ) {
704
712
final List <String > routingKeys ;
705
713
if (exchangeType .equals (ExchangeTypes .FANOUT ) || binding .key ().length == 0 ) {
706
714
routingKeys = Collections .singletonList ("" );
@@ -725,6 +733,7 @@ private void registerBindings(QueueBinding binding, String queueName, String exc
725
733
}
726
734
((ConfigurableBeanFactory ) this .beanFactory )
727
735
.registerSingleton (exchangeName + "." + queueName + ++this .increment , actualBinding );
736
+ declarables .add (actualBinding );
728
737
}
729
738
}
730
739
@@ -815,7 +824,7 @@ else if (resolved instanceof String) {
815
824
}
816
825
}
817
826
818
- private String resolveExpressionAsString (String value , String attribute ) {
827
+ protected String resolveExpressionAsString (String value , String attribute ) {
819
828
Object resolved = resolveExpression (value );
820
829
if (resolved instanceof String ) {
821
830
return (String ) resolved ;
0 commit comments