diff --git a/spring-jms/src/main/java/org/springframework/jms/annotation/JmsListener.java b/spring-jms/src/main/java/org/springframework/jms/annotation/JmsListener.java index 2084754578..7f3f685f9d 100644 --- a/spring-jms/src/main/java/org/springframework/jms/annotation/JmsListener.java +++ b/spring-jms/src/main/java/org/springframework/jms/annotation/JmsListener.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -76,6 +76,7 @@ import org.springframework.messaging.handler.annotation.MessageMapping; * composed annotations with attribute overrides. * * @author Stephane Nicoll + * @author Sam Brannen * @since 4.1 * @see EnableJms * @see JmsListenerAnnotationBeanPostProcessor @@ -110,6 +111,12 @@ public @interface JmsListener { /** * The name for the durable subscription, if any. + *
As of Spring Framework 5.3.26, if an explicit subscription name is not + * specified, a default subscription name will be generated based on the fully + * qualified name of the annotated listener method — for example, + * {@code "org.example.jms.ProductListener.processRequest"} for a + * {@code processRequest(...)} listener method in the + * {@code org.example.jms.ProductListener} class. */ String subscription() default ""; diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/adapter/MessagingMessageListenerAdapter.java b/spring-jms/src/main/java/org/springframework/jms/listener/adapter/MessagingMessageListenerAdapter.java index 28904b425e..5f09fdf1fa 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/adapter/MessagingMessageListenerAdapter.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/adapter/MessagingMessageListenerAdapter.java @@ -43,6 +43,10 @@ import org.springframework.util.Assert; * are provided as additional arguments so that these can be injected as * method arguments if necessary. * + *
As of Spring Framework 5.3.26, {@code MessagingMessageListenerAdapter} implements + * {@link SubscriptionNameProvider} in order to provide a meaningful default + * subscription name. See {@link #getSubscriptionName()} for details. + * * @author Stephane Nicoll * @author Sam Brannen * @since 4.1 @@ -70,16 +74,6 @@ public class MessagingMessageListenerAdapter extends AbstractAdaptableMessageLis return this.handlerMethod; } - @Override - public String getSubscriptionName() { - if (this.handlerMethod != null) { - return this.handlerMethod.getBeanType().getName() + "#" + this.handlerMethod.getMethod().getName(); - } - else { - return this.getClass().getName(); - } - } - @Override public void onMessage(javax.jms.Message jmsMessage, @Nullable Session session) throws JMSException { @@ -145,4 +139,28 @@ public class MessagingMessageListenerAdapter extends AbstractAdaptableMessageLis .build(); } + /** + * Generate a subscription name for this {@code MessageListener} adapter based + * on the following rules. + *
These tests are similar to those in {@link MessagingMessageListenerAdapterTests},
+ * except that these tests have a different scope and do not use mocks.
+ *
+ * @author Sam Brannen
+ * @since 5.3.26
+ * @see MessagingMessageListenerAdapterTests
+ */
+class MessagingMessageListenerAdapterIntegrationTests {
+
+ @ParameterizedTest
+ @MethodSource("subscriptionNames")
+ void defaultSubscriptionName(Method method, String subscriptionName) {
+ MessagingMessageListenerAdapter messageListenerAdaptor = new MessagingMessageListenerAdapter();
+ InvocableHandlerMethod handlerMethod = new InvocableHandlerMethod(new CustomListener(), method);
+ messageListenerAdaptor.setHandlerMethod(handlerMethod);
+
+ SimpleMessageListenerContainer listenerContainer = new SimpleMessageListenerContainer();
+ assertThat(listenerContainer.getSubscriptionName()).isNull();
+
+ listenerContainer.setMessageListener(messageListenerAdaptor);
+ assertThat(listenerContainer.getSubscriptionName()).isEqualTo(subscriptionName);
+ }
+
+
+ private static Stream