【问题标题】:HornetQ Behaviour for unacknowledged messages未确认消息的 HornetQ 行为
【发布时间】:2017-11-05 23:06:26
【问题描述】:

我有一个基于 HornetQ 的 JMS 提供者,消费者在 CLIENT_ACKNOWLEDGE_MODE 中附加到提供者。 message.acknowledge () sn-p 虽然在 if else 之下。因此,如果应用层在处理消息时出现故障,消费者有时不会向服务器发送确认。所以这里有两个问题 -

1) 更多在服务器中排队的消息会继续发送吗 流向消费者,即使消费者不承认 如前所述的消息中的一个

2) 未确认的消息是否会在重新启动时再次向下流动 消费者。

这些是我对我提出的问题的一些观察

1) 消息按照 消费者日志,即使它没有确认其中一条消息 由于应用层故障而发送到服务器(注意,有 没有未捕获的异常,只是消费者没有 承认) 。

2)其次,在重新启动消费者时,消息也没有 令人惊讶的是再次从服务器流下来。

有人可以澄清这种行为吗?

【问题讨论】:

    标签: jms hornetq


    【解决方案1】:

    很难完全确定您的应用程序在消息确认方面正在做什么,但我的猜测是您在尝试确认相关消息失败后继续确认消息。在这种情况下,因为您使用的是客户端确认模式,所以下一个确认也将应用于上一条消息,因为这就是客户端模式的工作方式。

    Session.CLIENT_ACKNOWLEDGE:客户端通过调用消息的确认方法来确认消息。在这种模式下,确认发生在会话级别:确认已消费的消息会自动确认已收到其会话已消费的所有消息。例如,如果消息消费者消费了 10 条消息,然后确认发送的第 5 条消息,则所有 10 条消息都被确认。

    因此,如果您仔细阅读,您会发现会话中的消费者在客户端确认模式下确认消息是如何相互影响的。

    要获得更好的答案,您需要进一步分解事件链,以便更清楚发生了什么。

    【讨论】:

    • -“我的猜测是您在尝试确认相关消息失败后继续确认消息”-如果其他消息从服务器和消费者流出,则在未确认其中一条消息之后是的成功处理它们,然后它发送一个确认。 (注意 - 它并没有不承认,由于应用层中的一些错误状态,消费者没有故意承认,尽管我不确定为什么,因为我正在使用遗留代码)。
    • 这就是为什么我在原始问题中问的原因,因为它在文档中不是很清楚- 1)1) 即使消费者这样做了,服务器中排队的更多消息是否会继续流向消费者如前所述,不确认其中一条消息。您能否解释一下为什么当其中一条消息未被确认时,更多的消息会从服务器传下来。此外,如果这是正确的行为,是否有一个设置可以配置服务器在消费者未能确认其中一条消息时不发送更多消息。
    • 您未能回答更大的问题,即在此之后是否有其他消息被确认。
    • 是的,正如我在第一条评论中提到的那样,它们正在得到确认 - “如果其他消息从服务器流出并且消费者成功处理它们,那么它会发送确认”
    • 正如我已经告诉你的那样,这就是你的答案,只要你在会话中确认任何消息,所有以前的消息都会被确认
    猜你喜欢
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多