2016-05-31 3 views
0

キューで利用可能な新しいメッセージを待って、それらを即座に処理する必要があるとしましょう。トランザクション配信に関する要件はありません。Spring JmsTemplateでの高速JMSの使用

JmsTemplate#receiveは非常に便利ですが、パフォーマンスの点で優れているかどうかはわかりません。正直に言うとかなり遅いようです。

私は、毎回同じ初期化処理が実行されるため、時間がかかると思います。だから私は、はるかに高速であるように思われたCONNECTIN、目的地と消費者を再利用し、その次の道を作った:

private void startAsyncReceiver(final BlockingQueue<String> localQueue, final String remoteQueueName) { 
    Thread t = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      jmsTemplate.execute(new SessionCallback<Object>() { 
       @Override 
       public Object doInJms(Session session) throws JMSException { 
        try { 
         Destination destination = destinationResolver.resolveDestinationName(session, remoteQueueName, false); 
         MessageConsumer consumer = session.createConsumer(destination); 
         sessionsStartedLatch.countDown(); 
         while (true) { 
          Message message = consumer.receive(MAX_VALUE); 
          String body = (String) jmsTemplate.getMessageConverter().fromMessage(message); 
          localQueue.put(body); 
         } 
        } catch (InterruptedException e) { 
         return null; 
        } 
       } 
      }, true); 
     } 
    }, remoteQueueName + "-Receiver"); 
    t.setDaemon(true); 
    t.start(); 
} 

Q1JmsTemplate#receiveが悪化performabceは同じアルゴリズムのために結果が示された理由を任意のアイデア?何か不足していますか?
Q2:現在の実装で潜在する問題はありますか?

答えて

2

テンプレートは、受信ごとにコンシューマーを作成する必要があります。

キャッシュコンシューマをtrueに設定してキャッシュ接続ファクトリを使用すると、コードに近づいてもJmsTemplateのパフォーマンスが大幅に向上するはずです。

しかし、実装は問題ありません。

+0

ご返信ありがとうございます。それぞれの 'consumer.receive()'の後に 'session.commit()'を使用してJMS側のリソースを解放することを検討すべきでしょうか? –

+0

トランザクションを使用している場合のみ。 –

関連する問題