diff --git a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/annotation/RabbitListener.java b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/annotation/RabbitListener.java index 51c43847..8b378707 100644 --- a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/annotation/RabbitListener.java +++ b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/annotation/RabbitListener.java @@ -332,4 +332,18 @@ public @interface RabbitListener { */ String converterWinsContentType() default "true"; + /** + * Override the container factory's {@code batchListener} property. The listener + * method signature should receive a {@code List}; refer to the reference + * documentation. This allows a single container factory to be used for both record + * and batch listeners; previously separate container factories were required. + * @return "true" for the annotated method to be a batch listener or "false" for a + * single message listener. If not set, the container factory setting is used. SpEL and + * property place holders are not supported because the listener type cannot be + * variable. + * @since 3.0 + * @see Boolean#parseBoolean(String) + */ + String batch() default ""; + } diff --git a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/annotation/RabbitListenerAnnotationBeanPostProcessor.java b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/annotation/RabbitListenerAnnotationBeanPostProcessor.java index 74983a73..e72f0a85 100644 --- a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/annotation/RabbitListenerAnnotationBeanPostProcessor.java +++ b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/annotation/RabbitListenerAnnotationBeanPostProcessor.java @@ -461,6 +461,9 @@ public class RabbitListenerAnnotationBeanPostProcessor resolvePostProcessor(endpoint, rabbitListener, target, beanName); resolveMessageConverter(endpoint, rabbitListener, target, beanName); resolveReplyContentType(endpoint, rabbitListener); + if (StringUtils.hasText(rabbitListener.batch())) { + endpoint.setBatchListener(Boolean.parseBoolean(rabbitListener.batch())); + } RabbitListenerContainerFactory factory = resolveContainerFactory(rabbitListener, target, beanName); this.registrar.registerEndpoint(endpoint, factory); diff --git a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/AbstractRabbitListenerContainerFactory.java b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/AbstractRabbitListenerContainerFactory.java index bb1f6b1f..086d8ff1 100644 --- a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/AbstractRabbitListenerContainerFactory.java +++ b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/AbstractRabbitListenerContainerFactory.java @@ -381,7 +381,9 @@ public abstract class AbstractRabbitListenerContainerFactory in) { this.foosConsumerBatchToo = in; this.fooConsumerBatchTooLatch.countDown();