-->

如何在不断线程读取JMS消息,并根据其在另一个线程JMSMessageID按achnowledge呢

2019-10-17 11:50发布

我写了一个连续的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是超时之后空 ),而它在队列中存在。 我怀疑由连续输入线程被阻塞的消息。的确,烧制AcknowledgeMes​​sage的(时候)独自一人,它工作正常。

是否1条检索消息更清洁的方式? 基于其QueueId和MESSAGEID
另外,我觉得有可能是内存泄漏的风险在不断的读者,如果有在很长一段时间来背诵消息或ID ..有道理?

如果我使用QueueBrowser来避免影响应答主题,它看起来像我不能有这样的连续输入进..对不对?

更多的背景:我使用的ActiveMQ和2个线程2个自定义“步骤”一个Pentaho水壶改造。
注意:代码示例简化为重点考虑的问题。

Answer 1:

嗯,你不能读取信息的两倍,因为你已经在第一个线程读取它。

ActiveMQ的将不删除该邮件,你还没有承认这一点,但直到你放弃的JMS连接将不可见(我不知道如果有一个长超时这里以及在ActiveMQ中)。

所以,你将不得不使用原始的消息,并做到: message.acknowledge(); 。 但是请注意,该会话不是线程安全的,所以一定要小心,如果你这样做是两个不同的线程。



文章来源: How to continuously read JMS Messages in a thread and achnowledge them based on their JMSMessageID in another thread?