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();
}
Q1:JmsTemplate#receive
が悪化performabceは同じアルゴリズムのために結果が示された理由を任意のアイデア?何か不足していますか?
Q2:現在の実装で潜在する問題はありますか?
ご返信ありがとうございます。それぞれの 'consumer.receive()'の後に 'session.commit()'を使用してJMS側のリソースを解放することを検討すべきでしょうか? –
トランザクションを使用している場合のみ。 –