【问题标题】:ActiveMQ prebvents new subscribers from getting frames, once there are frames一旦有帧,ActiveMQ 会阻止新订阅者获取帧
【发布时间】:2017-01-01 06:46:28
【问题描述】:

我已经尝试了几种库和语言(php5|php7|Stomp 扩展|ZF1 Stomp| Python2.7 Stomp 包)。
我发现如果队列有订阅者,并且它开始从队列中获取消息(帧),那么在此期间任何新订阅者都不会收到任何消息。

我的问题:
有没有办法为当前有消息的队列创建新订阅者 + 现有订阅者,并且新订阅者将接收这些消息。
我不发送独占订阅者标头。
如果我在收到消息之前有两个订阅者,那么两个订阅者都会参与。

【问题讨论】:

    标签: php python queue activemq stomp


    【解决方案1】:

    您很可能会遇到预取问题,其中第一个客户端已经预取了所有消息并正在翻阅它们,而第二个客户端则没有收到任何消息。为了解决这个问题,您应该使用ActiveMQ STOMP guide 中给出的值来配置客户端的一个小的预取值,例如 1。客户端需要添加header activemq.prefetchSize:1 等。

    您还可以将客户端订阅设置为使用客户端确认模式,这将允许您控制消息何时被视为已处理并防止代理发送更多消息。

    【讨论】:

    • 我在成功处理完每条消息后确认。如果我在发送消息之前有两个订阅者,则每个订阅者都会(几乎)获得相等的消息份额。这对预取场景有意义吗? (也许 AMQ 看到有多少订阅者并将它们发送相等的部分?)
    • 取决于他们订阅时有多少消息,第一个进入的人收到一批发送给他的消息,如果第一个收到所有消息,下一个进入的人可能看不到任何消息。尝试共享时有很多陷阱,预取平衡就是其中之一。
    • 所以,只是为了验证,一旦队列中有现有消息,新订阅者就没有这样的“块”。我会尝试预取 1。顺便说一句,是我还是大多数人甚至不使用队列?
    • 如果不查看应用程序代码和测试用例,就不可能说出到底发生了什么。由于协议的简单性,STOMP 可能更难以正确处理。
    猜你喜欢
    • 2017-01-24
    • 2013-10-09
    • 1970-01-01
    • 2022-09-27
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    相关资源
    最近更新 更多