【问题标题】:How to search for a particular message in JMS queue如何在 JMS 队列中搜索特定消息
【发布时间】:2016-04-30 01:06:56
【问题描述】:

我正在向 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();
        }
      }

【问题讨论】:

  • 我认为您在发布代码时犯了一个错误...第一个代码块不正确。您可以点击问题下方的edit 链接来更正您的问题。

标签: java jms activemq


【解决方案1】:

您的第一个问题是您试图将消息代理视为数据库,您必须始终记住这条明智的建议,“消息代理不是数据库”。

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

【讨论】:

  • 感谢@Tim Bish 的建议,截至目前我的队列有10 条消息要测试,我必须得到特定的消息。我一定会稍后调整我的maxPageSize。现在我正在使用, String id = String.valueOf(tid); .setStringProperty("abc", id); (制片人)。消费时我在这里遇到问题'session.createConsumer(queue,“abc =”+id)'。如果我直接传递 tid 值,作为 session.createConsumer(queue, "abc ='11'") 我可以消费。那么,我应该如何传递我的 id 值?请告诉我传递id的正确方法。
【解决方案2】:

只需将 id 值用单引号括起来

"JMSCorrelationID='"+id+"'"

不建议使用此功能,正如 Tim 所解释的,还有很多复杂性,但如果您想彻底使用它,请进行更改

【讨论】:

    【解决方案3】:

    您可以使用邮件的MeessageID 搜索邮件。这会很快,因为消息传递提供者在消息 id 上索引消息。还有其他基于CorrelationId、元数据等的搜索方式。

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

    【讨论】:

    • 在我的例子中,有不同的用户向队列发送消息,所以我需要确定消息 ID 属于谁(用户)。然后我想我需要维护一个键值对,指示用户 ID 和相应的 messageid 并从那里搜索。请告诉我,这是正确的做法吗?或任何其他获取特定消息的替代方法,并查看我对 Tim Bish 的评论。
    • 不确定您的业务逻辑。但我不相信你需要搜索消息。我更愿意在没有任何选择器的情况下接收消息,然后在收到的消息上应用业务逻辑。
    猜你喜欢
    • 2017-03-16
    • 1970-01-01
    • 2019-07-15
    • 2012-03-20
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 2012-01-19
    • 2011-09-07
    相关资源
    最近更新 更多