アプリケーションの起動時にアクティブなMQキューに接続するJMSリスナを持つSpring JMSアプリケーションがあります。このJMSリスナーは、メッセージを受け取り、コンテンツを充実させ、同じActiveMQブローカー上のトピックに配信するアプリケーションの一部です。アプリケーションサーバが突然停止したときにSpring JMSとActiveMQでJMSメッセージが失われる
sessionTransactedはTrueに設定されています。私はデータベーストランザクションを実行していないので、どこにでも@Transactionalを設定する必要はありません。私が読んだところでは、sessionTransactedプロパティは、JMSリスナのreceiveメソッドの周りにローカルトランザクションを設定します。したがって、トランザクションが完了するまで、メッセージはキューから取り出されません。私はローカルのActiveMQインスタンスとローカルのTomcatコンテナを使ってこれをテストしましたが、期待どおりに動作しました。
しかし、PERF環境にデプロイして同じテストを再試行すると、サーバーのシャットダウン時に現在飛んでいたメッセージが、受信方法を完了する前にキューから取得されていることがわかりました。
私が探しているはっきりしたものがあれば知りたいのですが?この現象が発生する特定のJMSヘッダーがありますか?私が提供できる情報がもうあれば教えてください。
は、私は、Java 8
UPDATEを実行しているのTomcat 7の容器には、Apache ActiveMQの5.8.0と春4.1.2.RELEASEを使用しています - 私のJavaのJMS設定を追加します。わかりやすくするために、PERFプロパティファイルの内容を該当する領域に置き換えました。
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() throws Throwable {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setMaxMessagesPerTask(-1);
factory.setConcurrency(1);
factory.setSessionTransacted(Boolean.TRUE);
return factory;
}
@Bean
public CachingConnectionFactory connectionFactory(){
RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
redeliveryPolicy.setInitialRedeliveryDelay(1000);
redeliveryPolicy.setRedeliveryDelay(1000);
redeliveryPolicy.setMaximumRedeliveries(6);
redeliveryPolicy.setUseExponentialBackOff(Boolean.TRUE);
redeliveryPolicy.setBackOffMultiplier(5);
ActiveMQConnectionFactory activeMQ = new ActiveMQConnectionFactory(environment.getProperty("queue.username"), environment.getProperty("queue.password"), environment.getProperty("jms.broker.endpoint"));
activeMQ.setRedeliveryPolicy(redeliveryPolicy);
activeMQ.setPrefetchPolicy(prefetchPolicy());
CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory(activeMQ);
cachingConnectionFactory.setCacheConsumers(Boolean.FALSE);
cachingConnectionFactory.setSessionCacheSize(1);
return cachingConnectionFactory;
}
@Bean
public JmsMessagingTemplate jmsMessagingTemplate(){
ActiveMQTopic activeMQ = new ActiveMQTopic(environment.getProperty("queue.out"));
JmsMessagingTemplate jmsMessagingTemplate = new JmsMessagingTemplate(connectionFactory());
jmsMessagingTemplate.setDefaultDestination(activeMQ);
return jmsMessagingTemplate;
}
protected ActiveMQPrefetchPolicy prefetchPolicy(){
ActiveMQPrefetchPolicy prefetchPolicy = new ActiveMQPrefetchPolicy();
int prefetchValue = 0;
prefetchPolicy.setQueuePrefetch(prefetchValue);
return prefetchPolicy;
}
おかげで、
フアン
JMSテンプレートのコンフィグレーションを投稿 –
JMSテンプレートコンフィグレーションを含む質問が更新されました – jcb