这是Difference between AUTO_ACKNOWLEDGEMENT mode with and without Spring JMS的后续问题。
我正在使用DMLC,我的并发消费者数量是1.预取限制是> 1.我收到一条消息,并在听众执行之前得到确认。因此,当侦听器正在执行时,代理会有更多消息,并根据预取设置将其发送给使用者。由于监听器仍在执行,消费和确认如何适用于后续消息?
是否会为所有新消息调用receive()并确认它们并等待侦听器执行完成? [如果是这种情况,那么我很困惑,为什么我在消费者统计数据中得到了未被承认的消费者数量] 要么 将调用receive(),但在上一个侦听器完成执行之前,将不会确认下一条消息? [如果由于某些其他原因导致我的侦听器执行被阻止,这可能会解释未确认的消息] 要么 引擎盖下还发生了其他事情。
有人可以解释一下吗?这对我很有帮助。
谢谢,干杯!
答案 0 :(得分:0)
没有。调用receive()
来获取第一条消息;收到退货时确认;容器线程然后调用侦听器。 (如果要回滚失败的传递,则必须使用与DMLC的事务 - 如果您的侦听器抛出异常)。
任何预取的消息都由代理提供给客户端库,但在处理完上一条消息后,侦听器退出(onMessage()
)之前,Spring不会看到它们。即receive()
在与MessageListener
相同的线程上调用。
预取是好的,下一个消息将立即可用于下一个receive()
,但缺点是,如果您有多个消费者线程并且监听器有时需要很长时间来处理消息,则预取当其他线程空闲时,消息可以放在队列中。