Java 从ActiveMq中的队列中删除消息

Java 从ActiveMq中的队列中删除消息,java,activemq,Java,Activemq,我有一个具有多个activeMq队列的应用程序。我想列出其中的消息,并根据消息的id将它们从任何队列中删除 这是到目前为止我的代码 public void killMessage(String id) { try { ActiveMQConnection activeMqConnection = (ActiveMQConnection) connectionFactory.createConnection(); activeMqConnection.sta

我有一个具有多个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();
    }
}

如果您想使用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();
}