アノテーションインターフェース EnableJms


JmsListenerContainerFactory によってカバーに作成される JMS リスナーアノテーション付きエンドポイントを有効にします。@Configuration クラスで次のように使用されます。
@Configuration
@EnableJms
public class AppConfig {

    @Bean
    public DefaultJmsListenerContainerFactory myJmsListenerContainerFactory() {
      DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
      factory.setConnectionFactory(connectionFactory());
      factory.setDestinationResolver(destinationResolver());
      factory.setSessionTransacted(true);
      factory.setConcurrency("5");
      return factory;
    }

    // other @Bean definitions
}

JmsListenerContainerFactory は、特定のエンドポイントを担当するリスナーコンテナーの作成を担当します。上記のサンプルで使用されている DefaultJmsListenerContainerFactory のような一般的な実装では、基礎となる MessageListenerContainer によってサポートされる必要な構成オプションが提供されます。

@EnableJms は、コンテナー内の Spring 管理の Bean 上の @JmsListener アノテーションの検出を可能にします。例: MyService クラスが与えられた場合:

package com.acme.foo;

public class MyService {

    @JmsListener(containerFactory = "myJmsListenerContainerFactory", destination="myQueue")
    public void process(String msg) {
        // process incoming message
    }
}

使用するコンテナーファクトリは、使用する JmsListenerContainerFactory Bean の名前を定義する containerFactory 属性によって識別されます。何も設定されていない場合、jmsListenerContainerFactory という名前の JmsListenerContainerFactory Bean が存在すると想定されます。

次の構成により、"myQueue" という名前の Destination で Message が受信されるたびに、メッセージの内容を使用して MyService.process() が呼び出されます。

@Configuration
@EnableJms
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyService();
    }

    // JMS infrastructure setup
}

あるいは、MyService に @Component のアノテーションが付けられている場合、次の構成により、@JmsListener アノテーション付きメソッドが一致する受信メッセージで呼び出されることが保証されます。

@Configuration
@EnableJms
@ComponentScan(basePackages="com.acme.foo")
public class AppConfig {
}

作成されたコンテナーは、アプリケーションコンテキストに対して登録されませんが、JmsListenerEndpointRegistry を使用して管理目的で簡単に見つけることができます。

アノテーション付きメソッドは柔軟なシグネチャーを使用できます。特に、Message 抽象化と関連するアノテーションを使用できます。詳細については、JmsListener Javadoc を参照してください。たとえば、次のコードでは、メッセージの内容とカスタムの "myCounter" JMS ヘッダーが挿入されます。

@JmsListener(containerFactory = "myJmsListenerContainerFactory", destination="myQueue")
public void process(String msg, @Header("myCounter") int counter) {
    // process incoming message
}

これらの機能は、アノテーション付きメソッドを処理するために必要なインボーカーの構築を担当する MessageHandlerMethodFactory によって抽象化されます。デフォルトでは、DefaultMessageHandlerMethodFactory が使用されます。

さらに制御が必要な場合は、@Configuration クラスで JmsListenerConfigurer を実装できます。これにより、基になる JmsListenerEndpointRegistrar インスタンスにアクセスできます。次の例は、明示的なデフォルト JmsListenerContainerFactory を指定する方法を示しています

@Configuration
@EnableJms
public class AppConfig implements JmsListenerConfigurer {

    @Override
    public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) {
        registrar.setContainerFactory(myJmsListenerContainerFactory());
    }

    @Bean
    public JmsListenerContainerFactory<?> myJmsListenerContainerFactory() {
        // factory settings
    }

    @Bean
    public MyService myService() {
        return new MyService();
    }
}
参考のために、上記の例を次の Spring XML 構成と比較できます。
<beans>

    <jms:annotation-driven container-factory="myJmsListenerContainerFactory"/>

    <bean id="myJmsListenerContainerFactory" class="org.springframework.jms.config.DefaultJmsListenerContainerFactory">
          // factory settings
    </bean>

    <bean id="myService" class="com.acme.foo.MyService"/>

</beans>
}

コンテナーの作成および管理方法をより詳細に制御する必要がある場合は、カスタム JmsListenerEndpointRegistry を指定することもできます。以下の例では、Validated でアノテーションが付けられたペイロードが最初にカスタム Validator に対して検証されるように、カスタム Validator で使用するように JmsHandlerMethodFactory をカスタマイズする方法も示しています。

@Configuration
@EnableJms
public class AppConfig implements JmsListenerConfigurer {

    @Override
    public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) {
        registrar.setEndpointRegistry(myJmsListenerEndpointRegistry());
        registrar.setMessageHandlerMethodFactory(myJmsHandlerMethodFactory);
    }

    @Bean
    public JmsListenerEndpointRegistry<?> myJmsListenerEndpointRegistry() {
        // registry configuration
    }

    @Bean
    public JmsHandlerMethodFactory myJmsHandlerMethodFactory() {
       DefaultJmsHandlerMethodFactory factory = new DefaultJmsHandlerMethodFactory();
       factory.setValidator(new MyValidator());
       return factory;
    }

    @Bean
    public MyService myService() {
        return new MyService();
    }
}

参考のために、上記の例を次の Spring XML 構成と比較できます。

<beans>

    <jms:annotation-driven registry="myJmsListenerEndpointRegistry"
        handler-method-factory="myJmsHandlerMethodFactory"/>

    <bean id="myJmsListenerEndpointRegistry"
          class="org.springframework.jms.config.JmsListenerEndpointRegistry">
          // registry configuration
    </bean>

    <bean id="myJmsHandlerMethodFactory"
          class="org.springframework.messaging.handler.support.DefaultJmsHandlerMethodFactory">
        <property name="validator" ref="myValidator"/>
    </bean>

    <bean id="myService" class="com.acme.foo.MyService"/>

</beans>

JmsListenerConfigurer を実装すると、JmsListenerEndpointRegistrar を介してエンドポイント登録をきめ細かく制御することもできます。例: 以下は、追加のエンドポイントを構成します。

@Configuration
@EnableJms
public class AppConfig implements JmsListenerConfigurer {

    @Override
    public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) {
        SimpleJmsListenerEndpoint myEndpoint = new SimpleJmsListenerEndpoint();
        // ... configure the endpoint
        registrar.registerEndpoint(endpoint, anotherJmsListenerContainerFactory());
    }

    @Bean
    public MyService myService() {
        return new MyService();
    }

    @Bean
    public JmsListenerContainerFactory<?> anotherJmsListenerContainerFactory() {
        // ...
    }

    // JMS infrastructure setup
}

JmsListenerConfigurer を実装するすべての Bean が同様の方法で検出され、呼び出されることに注意してください。上記の例は、XML 構成を使用する場合、コンテキストに登録された通常の Bean 定義に変換できます。

導入:
4.1
作成者:
Stephane Nicoll
関連事項: