这是我在此处的第一篇文章,并且不确定在此之前是否进行过介绍,但是这里是这样:我有一个Kafka Streams应用程序,使用Processor API,遵循以下拓扑:
1. Consume data from an input topic (processor.addSource())
2. Inserts data into a DB (processor.addProcessor())
3. Produce its process status to an output topic (processor.addSink())
App的工作时间很长,但是,出于可追溯性的目的,我需要在日志中记录kstreams向输出主题及其RecordMetaData(主题,分区,偏移量)生成消息的时间。
以下示例:
KEY="MY_KEY" OUTPUT_TOPIC="MY-OUTPUT-TOPIC" PARTITION="1" OFFSET="1000" STATUS="SUCCESS"
我不确定是否有办法覆盖默认的kafka流生产者来添加此日志记录,或者是否可以创建自己的生产者以将其插入addSink进程。我通过实现自己的ExceptionHandler(default.producer.exception.handler)部分实现了此功能,但它仅涵盖了异常。
谢谢,
吉尔赫姆
答案 0 :(得分:2)
如果将流应用程序配置为使用letters = []
for word in words.split():
for char in word:
letters.append(char)
print(letters)
,则应该能够获取所需的信息。具体来说,实施onAcknowledgement()将提供对您上面列出的所有内容的访问。
要在流应用程序中配置拦截器,请执行以下操作:
for m in (move_map[key] for key in move_map if pressed[key]):
print(m)
如果需要,您可以提供多个拦截器,只需添加类名并将列表实现从单例更改为常规movements = []
for key in move_map:
if pressed[key]:
movements.append(move_map[key])
for m in movements:
print(m)
。拦截器的执行遵循列表中类的顺序。
编辑:为清楚起见,您可以通过KafkaClientSupplier interface在Kafka Streams中覆盖提供的ProducerInterceptor
,但是使用拦截器的IMHO是更干净的方法。但是哪个方向取决于您。您在overloaded Kafka Streams constructor中传递 Properties props = new Properties();
// add this configuration in addition to your other streams configs
props.put(StreamsConfig.producerPrefix(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG), Collections.singletonList(MyProducerInterceptor.class));
。