在我们的体系结构中,每个应用程序都有2个或更多容器,用于 高可用性的puproses。 我们正在使用activeMQ,我想实现以下行为。
我只希望一个消费者根据可用性来处理每条消息。 我们的实现使用Java。
请分享实现方式。
这是我的代码示例
final Connection consumerConnection = connectionFactory.createConnection();
consumerConnection.start();
// Create a session.
final Session consumerSession = consumerConnection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
final Destination consumerDestination = consumerSession.createQueue(queueName);
// Create a message consumer from the session to the queue.
final MessageConsumer consumer = consumerSession.createConsumer(consumerDestination);
// Begin to wait for messages.
Queue queue = consumerSession.createQueue(queueName);
QueueBrowser queueBrowser = consumerSession.createBrowser(queue);
Enumeration msgs = queueBrowser.getEnumeration();
while (msgs.hasMoreElements()) {
//do your things here
ActiveMQTextMessage message = (ActiveMQTextMessage) msgs.nextElement();
if (message == null)
continue;
//handle message
System.out.println("Message received in : " + message);
try {
String text = message.getText();
JSONObject messageJson = new JSONObject(text);
consumer.receive(1000);
String responseString = handleMessage(messageJson);
message.acknowledge();
谢谢 摩西
答案 0 :(得分:1)
这里的问题是您正在确认来自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
实例,您必须确认该实例才能真正使用队列中的消息。
...
// 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
。