【问题标题】:Remove message from a queue in ActiveMq从 ActiveMq 中的队列中删除消息
【发布时间】:2018-09-28 09:39:16
【问题描述】:

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

【问题讨论】:

  • 定义“不起作用”,因为当你运行它时我们不知道发生了什么。
  • 我的回答是否解决了您的问题?如果是这样,请将其标记为正确,以帮助将来可能有同样问题的其他人。谢谢!

标签: java activemq


【解决方案1】:

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

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

另外,您可能想要调用receive(int)(即超时),这样如果选择器由于某种原因找不到消息,您的应用程序就不会永远坐在那里等待方法返回。

【讨论】:

  • 我不确定这是正确的方向,但我也尝试过创建消费者。请查看我的编辑。
  • 如果我创建一个带有错误 jmsMessageId 的消费者,则会引发异常,但这不是我的情况。所以我认为它收到了消息。
  • 我已修改我的答案以解决您的消费者的问题。
猜你喜欢
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
  • 1970-01-01
  • 2017-06-09
  • 2014-02-13
  • 2012-08-17
相关资源
最近更新 更多