@@ -438,7 +438,11 @@ private void processMultiMethodListeners(Collection<KafkaListener> classLevelLis
438438 for (KafkaListener classLevelListener : classLevelListeners ) {
439439 MultiMethodKafkaListenerEndpoint <K , V > endpoint =
440440 new MultiMethodKafkaListenerEndpoint <>(checkedMethods , defaultMethod , bean );
441- processListener (endpoint , classLevelListener , bean , beanName );
441+ String beanRef = classLevelListener .beanRef ();
442+ this .listenerScope .addListener (beanRef , bean );
443+ processListener (endpoint , classLevelListener , bean , beanName , resolveTopics (classLevelListener ),
444+ resolveTopicPartitions (classLevelListener ));
445+ this .listenerScope .removeListener (beanRef );
442446 }
443447 }
444448
@@ -447,37 +451,49 @@ protected void processKafkaListener(KafkaListener kafkaListener, Method method,
447451 MethodKafkaListenerEndpoint <K , V > endpoint = new MethodKafkaListenerEndpoint <>();
448452 endpoint .setMethod (methodToUse );
449453
450- if (!processMainAndRetryListeners (kafkaListener , bean , beanName , methodToUse , endpoint )) {
451- processListener (endpoint , kafkaListener , bean , beanName );
454+ String beanRef = kafkaListener .beanRef ();
455+ this .listenerScope .addListener (beanRef , bean );
456+ String [] topics = resolveTopics (kafkaListener );
457+ TopicPartitionOffset [] tps = resolveTopicPartitions (kafkaListener );
458+ if (!processMainAndRetryListeners (kafkaListener , bean , beanName , methodToUse , endpoint , topics , tps )) {
459+ processListener (endpoint , kafkaListener , bean , beanName , topics , tps );
452460 }
461+ this .listenerScope .removeListener (beanRef );
453462 }
454463
455464 private boolean processMainAndRetryListeners (KafkaListener kafkaListener , Object bean , String beanName ,
456- Method methodToUse , MethodKafkaListenerEndpoint <K , V > endpoint ) {
465+ Method methodToUse , MethodKafkaListenerEndpoint <K , V > endpoint , String [] topics ,
466+ TopicPartitionOffset [] tps ) {
467+
468+ String [] retryableCandidates = topics ;
469+ if (retryableCandidates .length == 0 && tps .length > 0 ) {
470+ retryableCandidates = Arrays .stream (tps )
471+ .map (tp -> tp .getTopic ())
472+ .distinct ()
473+ .collect (Collectors .toList ())
474+ .toArray (new String [0 ]);
475+ }
457476
458477 RetryTopicConfiguration retryTopicConfiguration = new RetryTopicConfigurationProvider (this .beanFactory ,
459478 this .resolver , this .expressionContext )
460- .findRetryConfigurationFor (kafkaListener . topics () , methodToUse , bean );
479+ .findRetryConfigurationFor (retryableCandidates , methodToUse , bean );
461480
462481 if (retryTopicConfiguration == null ) {
463- this .logger .debug ("No retry topic configuration found for topics " + Arrays .asList (kafkaListener .topics ()));
482+ String [] candidates = retryableCandidates ;
483+ this .logger .debug (() ->
484+ "No retry topic configuration found for topics " + Arrays .toString (candidates ));
464485 return false ;
465486 }
466487
467488 RetryTopicConfigurer .EndpointProcessor endpointProcessor = endpointToProcess ->
468- this .processKafkaListenerAnnotationForRetryTopic (endpointToProcess , kafkaListener , bean );
469-
470- String beanRef = kafkaListener .beanRef ();
471- this .listenerScope .addListener (beanRef , bean );
489+ this .processKafkaListenerAnnotationForRetryTopic (endpointToProcess , kafkaListener , bean , topics , tps );
472490
473491 KafkaListenerContainerFactory <?> factory =
474492 resolveContainerFactory (kafkaListener , resolve (kafkaListener .containerFactory ()), beanName );
475493
476494 getRetryTopicConfigurer ()
477495 .processMainAndRetryListeners (endpointProcessor , endpoint , retryTopicConfiguration ,
478496 this .registrar , factory , this .defaultContainerFactoryBeanName );
479-
480- this .listenerScope .removeListener (beanRef );
481497 return true ;
482498 }
483499
@@ -539,39 +555,34 @@ private Method checkProxy(Method methodArg, Object bean) {
539555 }
540556
541557 protected void processListener (MethodKafkaListenerEndpoint <?, ?> endpoint , KafkaListener kafkaListener ,
542- Object bean , String beanName ) {
543-
544- String beanRef = kafkaListener .beanRef ();
545- if (StringUtils .hasText (beanRef )) {
546- this .listenerScope .addListener (beanRef , bean );
547- }
558+ Object bean , String beanName , String [] topics , TopicPartitionOffset [] tps ) {
548559
549- processKafkaListenerAnnotationBeforeRegistration (endpoint , kafkaListener , bean );
560+ processKafkaListenerAnnotationBeforeRegistration (endpoint , kafkaListener , bean , topics , tps );
550561
551562 String containerFactory = resolve (kafkaListener .containerFactory ());
552563 KafkaListenerContainerFactory <?> listenerContainerFactory = resolveContainerFactory (kafkaListener , containerFactory , beanName );
553564
554565 this .registrar .registerEndpoint (endpoint , listenerContainerFactory );
555566
556567 processKafkaListenerEndpointAfterRegistration (endpoint , kafkaListener );
557-
558- if (StringUtils .hasText (beanRef )) {
559- this .listenerScope .removeListener (beanRef );
560- }
561568 }
562569
563- private void processKafkaListenerAnnotationForRetryTopic (MethodKafkaListenerEndpoint <?, ?> endpoint , KafkaListener kafkaListener , Object bean ) {
564- processKafkaListenerAnnotationBeforeRegistration (endpoint , kafkaListener , bean );
570+ private void processKafkaListenerAnnotationForRetryTopic (MethodKafkaListenerEndpoint <?, ?> endpoint ,
571+ KafkaListener kafkaListener , Object bean , String [] topics , TopicPartitionOffset [] tps ) {
572+
573+ processKafkaListenerAnnotationBeforeRegistration (endpoint , kafkaListener , bean , topics , tps );
565574 processKafkaListenerEndpointAfterRegistration (endpoint , kafkaListener );
566575 }
567576
568- private void processKafkaListenerAnnotationBeforeRegistration (MethodKafkaListenerEndpoint <?, ?> endpoint , KafkaListener kafkaListener , Object bean ) {
577+ private void processKafkaListenerAnnotationBeforeRegistration (MethodKafkaListenerEndpoint <?, ?> endpoint ,
578+ KafkaListener kafkaListener , Object bean , String [] topics , TopicPartitionOffset [] tps ) {
579+
569580 endpoint .setBean (bean );
570581 endpoint .setMessageHandlerMethodFactory (this .messageHandlerMethodFactory );
571582 endpoint .setId (getEndpointId (kafkaListener ));
572583 endpoint .setGroupId (getEndpointGroupId (kafkaListener , endpoint .getId ()));
573- endpoint .setTopicPartitions (resolveTopicPartitions ( kafkaListener ) );
574- endpoint .setTopics (resolveTopics ( kafkaListener ) );
584+ endpoint .setTopicPartitions (tps );
585+ endpoint .setTopics (topics );
575586 endpoint .setTopicPattern (resolvePattern (kafkaListener ));
576587 endpoint .setClientIdPrefix (resolveExpressionAsString (kafkaListener .clientIdPrefix (), "clientIdPrefix" ));
577588 String group = kafkaListener .containerGroup ();
@@ -1076,7 +1087,7 @@ public String convert(byte[] source) {
10761087
10771088 }
10781089
1079- private static class ListenerScope implements Scope {
1090+ static class ListenerScope implements Scope {
10801091
10811092 private final Map <String , Object > listeners = new HashMap <>();
10821093
0 commit comments