在EventProcessorHost example之后,我们在onEvents()中实现了自定义逻辑。某些数据未得到处理,我怀疑这是由于Java客户端引发的警告所致。
在日志中,我们看到StorageException(用于更新租约或检查点的Blob存储超时),LeaseLostException(可能由于先前的异常)和EventHubException(事件中心在短时间内移动或脱机时)。
基本上我的问题是:这些异常如何影响事件的处理?我们如何确保不跳过任何事件(例如,通过带有重试的异常处理和作为最后手段完全关闭)? < / p>
我通读了docs并搜索了其他无法找到满意答案的问题(this和this提供了一些见解)。
我们的代码:
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())
}
}
}
...
}
答案 0 :(得分:1)
根据我对 EventProcessor 的理解,您将重新处理事件而不是丢失的事件。可能还有另一个潜在问题。
当您调用 checkpoint
时会发生什么,它会保留该 EventData
的序列号(偏移量等)流,说“我已经处理了这个。”
当您获得 StorageException
时,这意味着该序列号未成功保留,因此较旧事件的序列号仍保留在您的 Blob 存储中。如果您遇到 EventHubException
处理器在重新启动时断开连接的情况,它会尝试声明任何已过期的租约,并从上一个成功的检查点开始处理。
如果另一个事件处理器“窃取”了您当前正在处理的分区,您将获得 LeaseLostException
。当有多个 EventProcessor 实例正在运行并且客户端尝试平衡正在运行的实例之间的分区数量时,就会发生这种情况。