繁体   English   中英

从 ActiveMq 中的队列中删除消息

[英]Remove message from a queue in ActiveMq

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

如果要使用 JMS API 来执行此操作,则必须创建一个使用者并使用选择器来使用具有所需 ID 的消息。 队列浏览器不能消费消息; 它只能浏览它们。

在您粘贴的代码中,您正在创建一个事务处理会话,这意味着当您使用消息时,您需要提交会话,否则该消息将永远不会被确认。 也就是说,您最好使用AUTO_ACKNOWLEDGE创建非事务性会话。

此外,您可能希望调用receive(int) (即超时),以便如果选择器由于某种原因无法找到消息,您的应用程序不会一直坐在那里等待方法返回。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM