我有一个带有几个activeMq队列的应用程序。我想在其中列出消息,并根据消息的ID从任何队列中删除任何消息。
到目前为止,这是我的代码。
public void killMessage(String id) {
try {
ActiveMQConnection activeMqConnection = (ActiveMQConnection) connectionFactory.createConnection();
activeMqConnection.start();
DestinationSource destinationSource = activeMqConnection.getDestinationSource();
Set<ActiveMQQueue> queues = destinationSource.getQueues();
QueueSession queueSession = activeMqConnection.createQueueSession(true, Session.CLIENT_ACKNOWLEDGE);
for(ActiveMQQueue queue : queues) {
QueueBrowser browser = queueSession.createBrowser(queue);
Enumeration<?> messagesInQueue = browser.getEnumeration();
while (messagesInQueue.hasMoreElements()) {
Message message = (Message) messagesInQueue.nextElement();
System.out.println("Current id: " + message.getJMSMessageID());
if(message.getJMSMessageID().equals(id)){
System.out.println("-----message id found-------");
}
}
}
activeMqConnection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
我遍历所有队列,然后遍历每个队列中的所有消息。我甚至找到了我想要删除的消息,但是我找不到将其从队列中删除的方法。
修改
我还创建了一个消费者。我不确定消费者应该如何使消息从队列中消失。我对它的尝试完全没有任何影响,消息仍然在队列中,我没有收到任何错误消息,也没有抛出异常,这可能表明消费者与消息不匹配:
if(message.getJMSMessageID().equals(id)){
System.out.println("-----message id found-------");
MessageConsumer consumer = queueSession.createConsumer(queue, "JMSMessageID='" + id + "'");
consumer.receive();
consumer.close();
}
答案 0 :(得分:0)
如果要使用JMS API执行此操作,则必须创建使用者并使用选择器来使用具有所需ID的消息。队列浏览器无法使用消息;它只能浏览它们。
在您粘贴的代码中,您正在创建一个事务处理会话,这意味着当您使用该消息时,您需要提交会话,否则将永远不会确认该消息。也就是说,你最好用AUTO_ACKNOWLEDGE创建一个非交易会话。
此外,您可能希望调用receive(int)(即超时),以便如果选择器由于某种原因无法找到该消息,您的应用程序不会只是坐在那里等待返回的方法。