我有一个java程序,200个并发消费者从独立的HornetQ服务器提供的队列中读取。侦听器只是从队列中获取一个项目,随机等待1.5 - 2.5秒并确认回到队列(它是CLIENT_ACKNOWLEDGE)。
现在我在队列中创建了20.000条消息,启动这200个消费者,5秒后我在Connection上调用close(尝试使用stop)方法。到这时,消费者将处理大约1000条消息。但是,在完成当前工作并且不再从队列中接收任何更多内容之前,他们需要另外3分钟来处理另外大约10.000条消息,然后它们最终停止并且应用程序结束(connection.close()是阻塞调用)。 p>
我怀疑这可能是由于客户端的某种缓冲区而且我一直在寻找限制它的方法,并且在工厂配置中将这四个属性设置为尽可能严格:
<producer-window-size>1</producer-window-size>
<consumer-window-size>0</consumer-window-size>
<consumer-max-rate>1</consumer-max-rate>
<producer-max-rate>1</producer-max-rate>
我知道我并不一定需要所有这些,但我只是想尝试一切。我知道这些是正在注册的,因为一旦将消费者窗口大小设置为零,我已经解决了消费顺序的另一个问题。
答案 0 :(得分:0)
我们已根据以下提交更改了我们的代码以中断上游通信:
HORNETQ-1379&amp; https://bugzilla.redhat.com/show_bug.cgi?id=1125042 - 当服务器停止通过OIO交付时强制客户端
提交可能会让您了解更改内容:
https://github.com/hornetq/hornetq/commit/4c05475
基本上我们在连接关闭时强制关闭netty连接,这会在你关闭连接时中断与任何常客消息的通信。
我不认为这个提交是在2.2分支上完成的。