@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" という名前の DestinationEE で MessageEE が受信されるたびに、メッセージの内容とともに 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