@TargetSE(valueSE=TYPESE) @RetentionSE(valueSE=RUNTIMESE) @DocumentedSE @Import(value=JmsBootstrapConfiguration.class) public @interface 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
を指定することもできます。以下の例では、JmsHandlerMethodFactory
をカスタマイズしてカスタム Validator
で使用する方法も示しています。これにより、Validated
でアノテーション付けされたペイロードが最初にカスタム Validator
に対して検証されます。@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 定義に変換できます。JmsListener
, JmsListenerAnnotationBeanPostProcessor
, JmsListenerEndpointRegistrar
, JmsListenerEndpointRegistry