Java 从ActiveMq中的队列中删除消息
我有一个具有多个activeMq队列的应用程序。我想列出其中的消息,并根据消息的id将它们从任何队列中删除 这是到目前为止我的代码Java 从ActiveMq中的队列中删除消息,java,activemq,Java,Activemq,我有一个具有多个activeMq队列的应用程序。我想列出其中的消息,并根据消息的id将它们从任何队列中删除 这是到目前为止我的代码 public void killMessage(String id) { try { ActiveMQConnection activeMqConnection = (ActiveMQConnection) connectionFactory.createConnection(); activeMqConnection.sta
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();
}
}
如果您想使用jmsapi来实现这一点,那么您必须创建一个使用者并使用选择器来使用您想要的ID的消息。队列浏览器不能使用消息;它只能浏览它们 在粘贴的代码中,您正在创建一个事务会话,这意味着当您使用该消息时,您需要提交该会话,否则该消息将永远不会被确认。也就是说,您最好使用
AUTO\u ACKNOWLEDGE
创建一个非事务会话
另外,您可能希望调用
receive(int)
(即超时),这样,如果选择器由于某种原因找不到消息,您的应用程序就不会永远坐在那里等待方法返回。我不确定这是正确的方向,但我也尝试创建一个使用者。请参阅我的编辑。如果我使用错误的jmsMessageId创建了一个消费者,则会引发异常,但在我的案例中不会发生这种情况。因此,我认为它收到了信息。我修改了我的答案,以解决与您的消费者的问题。定义“不起作用”,因为我们无法知道您运行它时发生了什么。我的答案是否解决了您的问题?如果是,请将其标记为正确,以帮助将来可能有相同问题的其他人。谢谢
if(message.getJMSMessageID().equals(id)){
System.out.println("-----message id found-------");
MessageConsumer consumer = queueSession.createConsumer(queue, "JMSMessageID='" + id + "'");
consumer.receive();
consumer.close();
}