0

是否有任何选项可以在不使用开箱即用的“Resequencer”的情况下更改队列顺序?也许可以使用 JMS 客户端来获取队列中的最后一条消息而不是第一条消息?

4

1 回答 1

1

我认为您应该提供有关您要实现的目标的更多信息……无论如何,如果您阅读了诸如 MQ 之类的 JMS 实现的规范,您会发现 FIFO 顺序不能保证 100%。这意味着,如果您按照收到的消息的顺序进行中继,您很容易遇到麻烦。最好在邮件标题中添加一个渐进式数字,并根据需要使用它来处理邮件。如果您采用此解决方案,您有 2 个选项来实现您的目标:1)修改接收方业务逻辑以检查消息的标头;2)(如果您使用 MQ,可能是更清洁的方法)使用称为MESSAGE SELECTOR的东西。

消息选择器允许使用 SQL92 查询函数基于内容检索特定消息。MQ 规范指出:

  • JMS 消息提供了一种工具来向 JMS 消息头(在消息的实际正文之外)提供用户定义的元数据。

  • JMS 程序可以利用此功能
    根据选择标准选择消息子集,换句话说,JMS
    客户端只能选择它感兴趣的那些消息。

这里有一些关于这两个解决方案的实现的更多信息......您可能感兴趣并且在发送消息之前应该设置的属性是 JMSCorrelationID ,第一条消息将设置为 1,第二条消息设置为 2等等。

1)由于您对消息选择器更感兴趣,您可以跳到下一个项目符号。无论如何仅供参考,如果您决定采用解决方案 1,您可以在以下位置找到一些很好的参考:

http://activemq.apache.org/maven/apidocs/org/apache/activemq/ActiveMQQueueBrowser.html

2) 消息选择器。您的消息选择器将是一个 sql 字符串,例如: JMSCorrelationID = max(JMSCorrelationID)

如果你想在 java 中实现一个消息选择器,语法是:

MessageConsumer 消费者 = session.createConsumer(destination, messageSelectorString, true); ActiveMQObjectMessage objMsg = (ActiveMQObjectMessage) consumer.receiveNoWait();

于 2013-04-30T14:24:18.723 回答