アノテーション型 EnableRabbit
@TargetSE(TYPESE) @RetentionSE(RUNTIMESE) @DocumentedSE @Import(RabbitListenerConfigurationSelector.class) public @interface EnableRabbit
RabbitListenerContainerFactory
によって隠れて作成される Rabbit リスナーアノテーション付きエンドポイントを有効にします。次のようにConfiguration
クラスで使用します。@Configuration @EnableRabbit public class AppConfig { @Bean public SimpleRabbitListenerContainerFactory myRabbitListenerContainerFactory() { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); factory.setConnectionFactory(connectionFactory()); factory.setMaxConcurrentConsumers(5); return factory; } // other @Bean definitions }
RabbitListenerContainerFactory
は、特定のエンドポイントを担当するリスナーコンテナーを作成します。上記のサンプルで使用されているSimpleRabbitListenerContainerFactory
としての典型的な実装は、基礎となるMessageListenerContainer
によってサポートされる必要な構成オプションを提供します。@EnableRabbit
は、コンテナー内の Spring 管理の Bean 上のRabbitListener
アノテーションの検出を可能にします。例:MyService
クラスが与えられた場合:package com.acme.foo; public class MyService { @RabbitListener(containerFactory="myRabbitListenerContainerFactory", queues="myQueue") public void process(String msg) { // process incoming message } }
使用するコンテナーファクトリは、使用するRabbitListenerContainerFactory
Bean の名前を定義するcontainerFactory
属性によって識別されます。何も設定されていない場合、rabbitListenerContainerFactory
という名前のRabbitListenerContainerFactory
Bean が存在すると想定されます。次の構成では、
Message
が "myQueue" という名前のQueue
で受信されるたびに、MyService.process()
がメッセージのコンテンツとともに呼び出されるようにします。@Configuration @EnableRabbit public class AppConfig { @Bean public MyService myService() { return new MyService(); } // Rabbit infrastructure setup }
あるいは、MyService
に@Component
のアノテーションが付けられている場合、次の構成により、@RabbitListener
アノテーション付きメソッドが一致する受信メッセージで呼び出されることが保証されます。@Configuration @EnableRabbit @ComponentScan(basePackages="com.acme.foo") public class AppConfig { }
作成されたコンテナーは、アプリケーションコンテキストに対して登録されませんが、RabbitListenerEndpointRegistry
を使用して管理目的で簡単に見つけることができます。アノテーション付きメソッドは柔軟な署名を使用できます。特に、
Message
抽象化と関連するアノテーションを使用することが可能です。詳細については、RabbitListener
Javadoc を参照してください。たとえば、次のようにすると、メッセージのコンテンツとカスタムの "myCounter" AMQP ヘッダーが挿入されます。@RabbitListener(containerFactory = "myRabbitListenerContainerFactory", queues = "myQueue") public void process(String msg, @Header("myCounter") int counter) { // process incoming message }
これらの機能は、アノテーション付きメソッドを処理するために必要な呼び出し側を構築するMessageHandlerMethodFactory
によって抽象化されます。デフォルトでは、DefaultMessageHandlerMethodFactory
が使用されます。さらに制御が必要な場合は、
@Configuration
クラスでRabbitListenerConfigurer
を実装できます。これにより、基になるRabbitListenerEndpointRegistrar
インスタンスにアクセスできます。次の例は、明示的なデフォルトRabbitListenerContainerFactory
を指定する方法を示しています@Configuration @EnableRabbit public class AppConfig implements RabbitListenerConfigurer { @Override public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) { registrar.setContainerFactory(myRabbitListenerContainerFactory()); } @Bean public RabbitListenerContainerFactory<?> myRabbitListenerContainerFactory() { // factory settings } @Bean public MyService myService() { return new MyService(); } }
参考のために、上記の例を次の Spring XML 構成と比較できます。<beans> <rabbit:annotation-driven container-factory="myRabbitListenerContainerFactory"/> <bean id="myRabbitListenerContainerFactory" class="org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory"> // factory settings </bean> <bean id="myService" class="com.acme.foo.MyService"/> </beans>
RabbitListenerEndpointRegistry
を指定することもできます。以下の例では、RabbitHandlerMethodFactory
をカスタマイズしてカスタムValidator
で使用する方法も示しています。これにより、Validated
でアノテーション付けされたペイロードが最初にカスタムValidator
に対して検証されます。@Configuration @EnableRabbit public class AppConfig implements RabbitListenerConfigurer { @Override public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) { registrar.setEndpointRegistry(myRabbitListenerEndpointRegistry()); registrar.setMessageHandlerMethodFactory(myMessageHandlerMethodFactory()); } @Bean public RabbitListenerEndpointRegistry<?> myRabbitListenerEndpointRegistry() { // registry configuration } @Bean public RabbitHandlerMethodFactory myMessageHandlerMethodFactory() { DefaultRabbitHandlerMethodFactory factory = new DefaultRabbitHandlerMethodFactory(); factory.setValidator(new MyValidator()); return factory; } @Bean public MyService myService() { return new MyService(); } }
参考のために、上記の例を次の Spring XML 構成と比較できます。<beans> <rabbit:annotation-driven registry="myRabbitListenerEndpointRegistry" handler-method-factory="myRabbitHandlerMethodFactory"/> <bean id="myRabbitListenerEndpointRegistry" class="org.springframework.amqp.rabbit.config.RabbitListenerEndpointRegistry"> // registry configuration </bean> <bean id="myRabbitHandlerMethodFactory" class="org.springframework.amqp.rabbit.config.DefaultRabbitHandlerMethodFactory"> <property name="validator" ref="myValidator"/> </bean> <bean id="myService" class="com.acme.foo.MyService"/> </beans>
RabbitListenerConfigurer
を実装すると、RabbitListenerEndpointRegistrar
を介したエンドポイント登録のきめ細かい制御も可能になります。例: 以下は、追加のエンドポイントを構成します。@Configuration @EnableRabbit public class AppConfig implements RabbitListenerConfigurer { @Override public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) { SimpleRabbitListenerEndpoint myEndpoint = new SimpleRabbitListenerEndpoint(); // ... configure the endpoint registrar.registerEndpoint(endpoint, anotherRabbitListenerContainerFactory()); } @Bean public MyService myService() { return new MyService(); } @Bean public RabbitListenerContainerFactory<?> anotherRabbitListenerContainerFactory() { // ... } // Rabbit infrastructure setup }
RabbitListenerConfigurer
を実装するすべての Bean が同様の方法で検出され、呼び出されることに注意してください。上記の例は、XML 構成を使用する場合に、コンテキストに登録されている通常の Bean 定義に変換できます。- 導入:
- 1.4
- 作成者:
- Stephane Nicoll, Artem Bilan
- 関連事項:
RabbitListener
,RabbitListenerAnnotationBeanPostProcessor
,RabbitListenerEndpointRegistrar
,RabbitListenerEndpointRegistry