2013-04-30 58 views
0

有没有更改排队顺序而不使用开箱即用的“resequencer”的选项?也许可以使用JMS客户端来获取队列中的最后一条消息而不是第一条消息?ActiveMQ LIFO订购?

回答

1

我认为你应该提供更多关于你想要实现的内容的信息...... 无论如何,如果你阅读一些像MQ这样的JMS实现的规范,你会发现FIFO的顺序不能保证在100% 。 这意味着,如果您按照收到的消息顺序进行中继,则可能很容易出现问题。 将渐进数字添加到消息标题并根据需要使用它来处理消息是一种很好的做法。如果您采用这种解决方案,您有两种选择来实现您的目标: 1)修改接收器业务逻辑以检查消息的标题; 2)(可能更清洁的方法,如果你使用的是MQ)使用一种叫做的消息选择器

消息选择器允许使用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(目的地,messageSelectorString,真); ActiveMQObjectMessage objMsg =(ActiveMQObjectMessage)consumer.receiveNoWait();

+0

Andrea R1,谢谢你的回复。我有100个消息队列里面,我想像一个堆栈处理它。例如,消息依次排列:1,2,3 ... 99。但是,我希望以相反的方式接收它(不是严格的,但是反向),如:98,99,97 .. 2,1。不知道如何编写这个选择器:“MAX(timestamp)” – 2013-04-30 14:29:17

+0

根据定义,队列是指FIFO操作。为了逆转顺序,将所有内容推入堆栈,然后根据需要从堆栈中弹出元素。 – 2016-03-08 22:48:56