如何在JMS队列中搜索特定消息

时间:2016-01-23 12:36:16

标签: java jms activemq

我正在向JMS队列发送一些消息。搜索队列中特定消息的可能方法是什么?

我尝试了以下方式:我在向队列发送消息时设置JMSCorrelationID

 public void createDQueue(String queuename, String json, Integer userid) {
          try {

                QueueSession.AUTO_ACKNOWLEDGE );
                Queue queue = session.createQueue(queuename);
                ObjectMessage objectMessage = session.createObjectMessage();
                objectMessage.setJMSCorrelationID(String.valueOf(userid));
                objectMessage.setObject(json);
                session.createSender(queue).send(objectMessage);
                session.close();
                connection.close();
          }catch(Exception e){
              e.printStackTrace();
          }
      }

在消费者代码中,我想根据JMSCorrelationID获取特定消息。我无法得到那个特定的信息。你能建议一个解决方案吗?

public void getSpecificMessage(String queuename, Integer userid) {

         try {
            QueueConnectionFactory connectionFactory = new ActiveMQConnectionFactory( "tcp://localhost:61616");
                ((ActiveMQConnectionFactory) connectionFactory).setUseAsyncSend(true);
                QueueConnection connection = connectionFactory.createQueueConnection();
                connection.start();
                QueueSession session = connection.createQueueSession( false,
                     QueueSession.AUTO_ACKNOWLEDGE );
                String id = String.valueOf(userid);
            Queue queue = session.createQueue(queuename);
            QueueReceiver receiver = session.createReceiver(queue, "JMSCorrelationID="+id);
             Message message = receiver.receive();              
        } catch (JMSException e) {              
            e.printStackTrace();
        }
      }

3 个答案:

答案 0 :(得分:2)

您的第一个问题是您正在尝试将消息代理视为一个数据库,您必须始终记住这句忠告,“消息代理不是数据库”。

在代理不会从磁盘中分页更多邮件之前,消费者或队列浏览器可以进入目标的深度有一定的限制,因此您需要检查深度并查看它是否大于您的maxPageSize设置和调整根据需要,但请记住,分页的消息会一直保留在内存中直到消耗完为止。

答案 1 :(得分:1)

将id值包装在单引号中

"JMSCorrelationID='"+id+"'"

建议不要使用此功能,如Tim所解释的那样,还有更多的复杂功能,但是如果你想与它一起做出改变那就做出改变

答案 2 :(得分:0)

您可以使用邮件的MeessageID搜索邮件。当消息传递提供者在消息id上索引消息时,这将是快速的。还有其他方法可以根据CorrelationId,元数据等进行搜索。

但请记住,使用消息传递提供程序的主要目的是以独立于时间的方式连接应用程序。接收应用程序必须尽快收到消息。如果消息堆积在队列中,则表示必须解决的问题。