Azure事件中心Java客户端未处理数据

Azure事件中心Java客户端未处理数据,java,azure,azure-eventhub,Java,Azure,Azure Eventhub,遵循以下步骤,我们在OneEvents()中实现了自定义逻辑。有些数据没有被处理,我怀疑这是因为Java客户端抛出了警告 在日志中,我们看到StorageException(blob存储在续订租约或检查点时超时)、LeaseLosteException(可能是由于以前的异常)和EventHubException(当事件中心移动或脱机一小段时间时) 基本上,我的问题是:这些异常如何影响事件的处理,我们如何确保不跳过任何事件(例如,通过异常处理,最后重试并完全关闭)? 我通读了这本书,并搜索了其他问

遵循以下步骤,我们在OneEvents()中实现了自定义逻辑。有些数据没有被处理,我怀疑这是因为Java客户端抛出了警告

在日志中,我们看到StorageException(blob存储在续订租约或检查点时超时)、LeaseLosteException(可能是由于以前的异常)和EventHubException(当事件中心移动或脱机一小段时间时)

基本上,我的问题是:这些异常如何影响事件的处理,我们如何确保不跳过任何事件(例如,通过异常处理,最后重试并完全关闭)?

我通读了这本书,并搜索了其他问题,但没有找到令人满意的答案(其中一个问题提供了一些见解)

我们的守则:

public class EventProcessor implements IEventProcessor {
    ...
    @Override
    public void onEvents(PartitionContext context, Iterable<EventData> events) throws Exception {
        for (EventData event : events) {
            try {
                String message = new String(event.getBytes(), StandardCharsets.UTF_8);

                mystuff.process(message);

                this.checkpointBatchingCount++;
                if ((checkpointBatchingCount % 50) == 0) {
                    context.checkpoint(data).get();
                }
            } catch (Exception e) {
                LOG.warn("Processing event failed: {}", e.getMessage())
            }
        }
    }
    ...
}
公共类事件处理器实现IEventProcessor{
...
@凌驾
public void OneEvents(PartitionContext上下文,Iterable事件)引发异常{
对于(EventData事件:事件){
试一试{
字符串消息=新字符串(event.getBytes(),StandardCharsets.UTF_8);
进程(消息);
这是checkpointBatchingCount++;
如果((checkpointBatchingCount%50)==0){
context.checkpoint(data.get();
}
}捕获(例外e){
warn(“处理事件失败:{}”,e.getMessage())
}
}
}
...
}

根据我对EventProcessor的理解,您将重新处理事件,而不是丢失事件。可能还有另一个潜在问题

调用
checkpoint
时发生的情况是,它为该
EventData
保留序列号(偏移量等)流,表示“我已经处理了这个”

当您获得一个
StorageException
时,这意味着序列号未成功持久化,因此旧事件的序列号将保留在blob存储中。如果遇到
EventHubException
处理器在重新启动时断开连接,它将尝试声明任何已过期的租约,并从最后一个成功的检查点开始处理


如果另一个事件处理器“偷走”了您当前正在处理的分区,您将得到
最少的异常。当有多个EventProcessor实例正在运行,而客户端试图平衡运行实例之间的分区数量时,就会发生这种情况。

我一直在四处搜索您的确切问题,不知道您是否找到了解决方案。我查看了eventhubs包(com.microsoft.azure.eventhubs.*)中的PartitionReceiveHandler,它包含一个onReceive,我不确定它是否解决了当前的问题。似乎IEventProcessor并不是一个监听器;调用registerEventProcessor时,在所需的OneEvents()方法中仅获取到该时间点之前的事件;然后它挂起,没有错误或退出,为了从所需的EventHub获取更多消息,我们必须重新开始。我对Azure Event Hub Java客户端非常失望,我们遇到了一个又一个问题(请查看他们Github repo上的我的问题)。我很高兴我当时工作的公司完全离开了Azure Event Hub,并在稍后阶段迁移到另一个流媒体平台。