使用Kafka Stream DSL在处理器中写入主题

时间:2019-04-17 12:55:50

标签: apache-kafka-streams

我需要同时使用Kafka Sreams API和Processor API。我还想在处理器实现中将不同类型的对象写入不同主题,即在进程标点符号上发射不同的对象强>。我已经看到有一个KIP-313 flatTransform可能会解决我的问题。

如果我使用:

inputStream.process(processorSupplier,,)

由于这是一个“终止”操作(其返回类型为void),我可以在处理器中使用内部的Kafka生产者。我还没有看到这样的实现方式,这是一种合理的方法吗,有副作用吗?

1 个答案:

答案 0 :(得分:0)

如果您需要如此低级的方法,则可以自己构建整个拓扑:

Topology topology = builder.build();
topology.addSource("inputNode","input");
topology.addProcessor("inProcessor", InputProcessor::new, "inputNode");
topology.addSink("sink1",
    (k, v, rc) -> "topic1",
    new StringSerializer(),
    new IntegerSerializer(),
    "inProcessor");
topology.addSink("sink2",
    (k, v, rc) -> "topic2",
    new StringSerializer(),
    new StringSerializer(),
    "inProcessor");

InputProcessor取决于业务逻辑产生不同类型的对象,并将它们传递到不同的接收器节点(主题)。

示例示例的逻辑如下:

  • 如果消息的值可以解析为Integer,则将其转发到两个接收器节点(sink1,sink2),以Integer的形式发送到sink1,以String的形式发送到接收器2。
  • 如果不是仅将邮件转发到接收器2。
public class InputProcessor extends AbstractProcessor<String, String> {
    @Override
    public void process(String key, String value) {
        try {
            context().forward(key, Integer.parseInt(value), To.child("sink1"));
            context().forward(key, value, To.child("sink2"));
        }
        catch (NumberFormatException nfe) {
            context().forward(key, value, To.child("sink2"));
        }
    }
}