我写了一个连续的JMS消息reveiver:在这里,我使用CLIENT_ACKNOWLEDGE,因为我不希望这个线程确认的消息。
(...)
connection.start();
session = connection.createQueueSession(true, Session.CLIENT_ACKNOWLEDGE);
queue = session.createQueue(QueueId);
receiver = session.createReceiver(queue);
While (true) {
message = receiver.receive(1000);
if ( message != null ) {
// NB : I can only pass Strings to the other thread
sendMessageToOtherThread( message.getText() , message.getJMSMessageID() );
}
// TODO Implement criteria to exit the loop here
}
在另一个线程,我会想办法如下(成功处理后):
这是在同时执行一个不同的JMS连接。
public void AcknowledgeMessage(String messageId) {
if (this.first) {
this.connection.start();
this.session = this.connection.createQueueSession( false, Session.AUTO_ACKNOWLEDGE );
this.queue = this.session.createQueue(this.QueueId);
}
QueueReceiver receiver = this.session.createReceiver(this.queue, "JMSMessageID='" + messageId + "'");
Message AckMessage = receiver.receive(2000);
receiver.close();
}
看来,该消息中没有找到(AckMessage是超时之后空 ),而它在队列中存在。 我怀疑由连续输入线程被阻塞的消息。的确,烧制AcknowledgeMessage的(时候)独自一人,它工作正常。
是否有1条检索消息的更清洁的方式? 基于其QueueId和MESSAGEID
另外,我觉得有可能是内存泄漏的风险在不断的读者,如果有在很长一段时间来背诵消息或ID ..有道理?
如果我使用QueueBrowser
来避免影响应答主题,它看起来像我不能有这样的连续输入进..对不对?
更多的背景:我使用的ActiveMQ和2个线程2个自定义“步骤”一个Pentaho水壶改造。
注意:代码示例简化为重点考虑的问题。