2016-12-21 9 views
0

アプリケーションの起動時にアクティブな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; 
} 

おかげで、

フアン

+0

JMSテンプレートのコンフィグレーションを投稿 –

+0

JMSテンプレートコンフィグレーションを含む質問が更新されました – jcb

答えて

0

それは私たちのPERF環境に配備我々のアプリケーションの異なるバージョンがあったことが判明。アプリケーションが更新されると、期待通りに機能しました。

関連する問題