アノテーション型 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