卡夫卡制片人拦截器

时间:2016-09-09 19:10:46

标签: java apache-kafka interceptor confluent bigdata

我正在尝试添加一个拦截器来对生产者发布到Kafka主题的消息进行验证。除了由Kafka主题执行的Schema验证之外,我还需要进行一些验证。我遵循的步骤如下。

  1. 我编写了一个扩展ProducerInterceptor接口的Java类。
  2. 编译该类并创建一个jar文件,该文件放在类路径中包含的文件夹中。
  3. 在Kafka安装中将intercetors.classes = classname添加到producer.properties。
  4. 但是当我向主题发布消息时,我没有调用我编写的自定义拦截器类。 (我也没有收到任何错误。消息完全发布到主题上。)

    我提到https://cwiki.apache.org/confluence/display/KAFKA/KIP-42%3A+Add+Producer+and+Consumer+Interceptors

    请就此提出建议。

2 个答案:

答案 0 :(得分:1)

这个问题很老了,所以我假设你在此期间找到了解决方案。但是,为了防止其他人,我发现我的buildconf.py类根据消息内容将消息分派给不同的主题,除非我的流已经有了指定的输出,否则不会调用它。

我的第一次尝试看起来像这样,因为我认为我不需要指定输出主题。这不起作用:

ProducerInterceptor

但这样做:

val builder: KStreamBuilder = new KStreamBuilder
val input = builder.stream("input-topic")

val stream: KafkaStreams = new KafkaStreams(builder, streamsConfigWithProducerInterceptor)
stream.start()

值得注意的是,在第二个示例中没有任何内容发布到val builder: KStreamBuilder = new KStreamBuilder val input = builder.stream("input-topic").through("dummy-output-topic") val stream: KafkaStreams = new KafkaStreams(builder, streamsConfigWithProducerInterceptor) stream.start() ,并且使用dummy-output-topic代替to也似乎也有同样的效果。

在我的情况下,我在调用through之前更改记录,然后使用拦截器将它们分配给不同的主题,所以我的代码看起来更像是这样:

map

我希望这些例子可以帮助那些与我犯同样错误的val builder: KStreamBuilder = new KStreamBuilder val input = builder.stream("input-topic") .map(new CustomKeyValueMapper) .through("dummy-output-topic") val stream: KafkaStreams = new KafkaStreams(builder, streamsConfigWithProducerInterceptor) stream.start() 人合作。

答案 1 :(得分:0)

属性名称是interceptor.classes,而不是intercetors.classes