在我们的架构中,我们为每个应用程序提供了2个或更多容器高可用性的puproses。我们正在使用activeMQ,我想实现以下行为。推送消息给……
这里的问题是你正在承认来自的消息 QueueBrowser 由于浏览器仅用于浏览消息而不消耗它们,因此该实例不会产生任何影响。
QueueBrowser
... QueueBrowser queueBrowser = consumerSession.createBrowser(queue); Enumeration msgs = queueBrowser.getEnumeration(); while (msgs.hasMoreElements()) { ... ActiveMQTextMessage message = (ActiveMQTextMessage) msgs.nextElement(); ... try { ... message.acknowledge(); // this does nothing
您 是 实际上创造了一个真实的消费和呼唤 consumer.receive(1000) ,但你丢弃了 Message 例如 receive() 回报。这是 Message 您必须确认实际使用队列中的消息的实例。
consumer.receive(1000)
Message
receive()
... // Create a message consumer from the session to the queue. final MessageConsumer consumer = consumerSession.createConsumer(consumerDestination); ... while (msgs.hasMoreElements()) { ... try { ... Message actualMessage = consumer.receive(1000); // acknowledge this! ...
另一个重要注意事项......队列浏览器接收的消息不能保证是队列的静态快照。因此,假设你的呼叫是危险的 consumer.receive(1000) 实际上是 相同 来自队列浏览器的消息。在我看来,你应该重新设计这个逻辑只用于 MessageConsumer 并放弃 QueueBrowser 。
MessageConsumer