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 08544dd50c7..679ca7c9a5b 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 @@ -79,6 +79,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 @@ -113,6 +114,12 @@ public @interface JmsListener { /** * The name for the durable subscription, if any. + *
As of Spring Framework 6.0.5, 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 c7e029f16bf..bc39fbdfa0c 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 6.0.5, {@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(jakarta.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 6.0.5
+ * @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