アノテーション型 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 } }使用するコンテナーファクトリは、使用するRabbitListenerContainerFactoryBean の名前を定義するcontainerFactory属性によって識別されます。何も設定されていない場合、rabbitListenerContainerFactoryという名前のRabbitListenerContainerFactoryBean が存在すると想定されます。次の構成では、"myQueue" という名前の
QueueでMessageが受信されるたびに、メッセージの内容とともに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抽象化と関連するアノテーションを使用できます。詳細については、RabbitListenerJavadoc を参照してください。たとえば、次のコードでは、メッセージの内容とカスタムの "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