从 ActiveMQ Artemis 队列读取消息时出错

问题描述 投票:0回答:1

我想从 ActiveMQ Artemis 队列中减去最后一条消息。我队列中有很多消息,当我读取一条消息时,其余消息就消失了,但代理控制台中的消息计数器显示少了 1 条消息。如何让它在刷新页面时少显示一条消息(这有效,但是当我中断消费者会话时)

这是阅读一条消息后发生的情况:

private void getMessage() throws JMSException, NamingException {
        Queue queue = (Queue) initialContext.lookup("dynamicQueues/" + "TestQueue");
        if (messageConsumer == null){
            messageConsumer = queueSession.createConsumer(queue);
        }
        TextMessage message = (TextMessage) messageConsumer.receive();
        String msgBody = ((TextMessage) message).getText();
        System.out.println(msgBody);
    }
java jms activemq-artemis
1个回答
0
投票

当核心 JMS 使用者开始接收消息时,代理会向其分派不止一条消息。这是一种性能优化,因此客户端不必重复网络往返代理即可接收其他消息。可以使用

consumerWindowSize
URL 参数调整此行为。有关更多详细信息,请参阅文档

在您的例子中,即使客户端只处理了一条消息,队列中的所有其他 6 条消息都已分派给它。处于已分派但尚未确认状态的消息被称为“正在传递”,并且可以通过队列上的“传递计数”指标进行跟踪。从技术上讲,“正在传递”的消息仍然在队列中,但其他使用者或队列浏览器无法使用它们。因此,它们不会显示在 Web 控制台上,尽管您仍然可以通过 QueueControl MBean 上的

listDeliveringMessages
listDeliveringMessagesAsJSON
JMX 操作列出它们。一旦消息被确认,它将被完全且永久地从队列中删除。如果消费者在确认所有“正在传递”消息之前关闭,那么这些消息将被放回到队列中,并再次可供其他消费者和队列浏览器使用。

如果您想禁用此行为,以便消费者每次网络往返仅收到 one 消息,那么您可以在客户端的连接 URL 上设置

consumerWindowSize=0
。这将允许队列中的所有其他消息对其他使用者和队列浏览器保持可用。但是,请记住,这将对消费者的表现产生不利影响。

© www.soinside.com 2019 - 2024. All rights reserved.