Azure事件中心ServiceBusException导致跳过的消息

时间:2017-03-02 18:23:31

标签: azure-eventhub

我们正在使用Azure Java event hub library从事件中心读取消息。大部分时间它都可以正常工作,但是我们会定期看到“com.microsoft.azure.servicebus.ServiceBusException”类型的异常,这些异常与事件中心中似乎被跳过的消息的时间相对应。

以下是一些例外细节示例:

  • “邮件容器正在关闭(这里有一些号码)。”
    • 这通常会同时击中多个分区,但不是全部。
    • callstack只包含com.microsoft.azure.servicebus和org.apache.qpid.proton。
  • “由于消费者(链接#)中发生错误,代理强制分离链接'xxx'。分离原点:InnerMessageReceiver已关闭。”
    • 这通常与com.microsoft.azure.servicebus.amqp.AmqpException例外有关。
    • callstack只包含com.microsoft.azure.servicebus和org.apache.qpid.proton。

示例callstack:

at com.microsoft.azure.servicebus.ExceptionUtil.toException(ExceptionUtil.java:93)
at com.microsoft.azure.servicebus.MessageReceiver.onError(MessageReceiver.java:393)
at com.microsoft.azure.servicebus.MessageReceiver.onClose(MessageReceiver.java:646)
at com.microsoft.azure.servicebus.amqp.BaseLinkHandler.processOnClose(BaseLinkHandler.java:83)
at com.microsoft.azure.servicebus.amqp.BaseLinkHandler.onLinkRemoteClose(BaseLinkHandler.java:52)
at org.apache.qpid.proton.engine.BaseHandler.handle(BaseHandler.java:176)
at org.apache.qpid.proton.engine.impl.EventImpl.dispatch(EventImpl.java:108)
at org.apache.qpid.proton.reactor.impl.ReactorImpl.dispatch(ReactorImpl.java:309)
at org.apache.qpid.proton.reactor.impl.ReactorImpl.process(ReactorImpl.java:276)
at com.microsoft.azure.servicebus.MessagingFactory$RunReactor.run(MessagingFactory.java:340)
at java.lang.Thread.run(Thread.java:745)

图书馆的客户似乎没有办法识别问题,并避免在事件中心前面跳过我们跳过的邮件。有没有其他人遇到这个?是否有其他方法可以识别并避免跳过或重试错过的消息?

1 个答案:

答案 0 :(得分:0)

此错误不会跳过任何消息 - 它会抛出异常,当它不应该时。这将导致EPH重新启动受影响的分区接收器。如果使用EventHubs javaclient的应用程序无法处理错误 - 它们可能会丢失消息。

这是我们的重试逻辑中的错误 - 在当前版本的EventHubs JavaClient中 - 直到0.11.0

Here's跟踪进度的相应问题。

在EventHubs服务中 - 如果 - 由于任何原因 - Container托管您的EventHubs'代码必须关闭,就会发生这些错误(为了解释,我们假设我们运行了一组{{ 1}}' - 就像每个Container命名空间一样DockerContainers - 这是一个瞬态错误 - 这个EventHub最终会在另一个Container中打开。

我们的javaclient-retry逻辑应该已经处理了这个错误并且应该重试 - 将使用修复程序发布此线程。

修改

我们刚刚发布了0.12.0 - 解决了这个问题。

谢谢! Sreeram

相关问题