DMLC 消息消费和确认

DMLC message consumption and acknowledgement

这是 的跟进问题。

我正在使用 DMLC,我的并发消费者数为 1。预取限制 > 1。我收到一条消息,它在执行侦听器之前得到确认。因此,当侦听器正在执行时,代理有更多消息并根据预取设置将其发送给消费者。由于侦听器仍在执行,后续消息的消费和确认将如何工作?

是否会为所有新消息调用 receive() 并确认它们并等待侦听器执行完成? [如果是这种情况,那么我很困惑为什么我在消费者统计信息中得到 unacknowledgedmessagecount] 或者 receive() 将被调用,但在前一个侦听器完成执行之前不会确认下一条消息? [如果我的侦听器执行由于某些其他原因被阻止,这可能会解释未确认的消息] 或者 引擎盖下还发生了其他事情。

有人可以解释一下吗?对我有很大帮助。

谢谢和干杯!

没有。 receive() 被调用以获取第一条消息;接收时确认 returns;然后容器线程调用侦听器。 (如果你想回滚失败的交付 - 如果你的监听器抛出异常,你必须使用 DMLC 的事务)。

任何预取的消息都由代理传送到客户端库,但 Spring 不会看到它们,直到您的侦听器在处理完上一条消息后退出 (onMessage())。即 receive() 在与 MessageListener.

相同的线程上被调用

预取的好处在于下一条消息将立即可用于下一条 receive(),但缺点是,如果您有多个消费者线程并且一个侦听器有时可能需要很长时间来处理一条消息, 预取消息可以在其他线程空闲时位于他的队列中。