アノテーションインターフェース 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
EE で Message
EE が受信されるたびに、メッセージの内容で 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
- 関連事項: