使用Kafka Streams DSL,我将事件反序列化为bean,然后将其包装为“ EventCarrier”。 KStream处理事件。
EventCarrier允许我记录处理期间发生的任何异常。我根据是否存在异常将流分为成功流和失败流。
模型运行良好,直到我将流加入KTable。在这一点上,似乎Kafka放弃了EventCarrier,并通过再次反序列化原始事件来创建一个新的Carrier。原来存储在原始EventCarrier中的所有专家都将丢失。
在这种情况下是否应该进行反序列化,或者我做错了什么?
KStream<String, EventCarrier> notificationStream[] = myStream
.filter((key, carrier) -> shouldNotify(carrier.getEvent()))
.selectKey((key, carrier) -> carrier.getEvent().getGuid())
.peek((key, carrier) -> carrier.recordException(new Exception("Ouch!!")))
.peek((key, carrier) -> System.out.println("1:" + carrier.getException()))
.leftJoin(notificationsTable, (carrier, notification) ->
recordWhetherNotificationFound(carrier, notification))
.peek((key, carrier) -> System.out.println("2:" + carrier.getException()))
和方法
private ProductEventCarrier recordWhetherNotificationFound(ProductEventCarrier carrier, NotificationEvent notification) {
carrier.setNotificationFound(nonNull(notification));
return carrier;
}
在上面的代码中,异常在第一个println中按预期方式打印,但在第二个println中为空。