我需要同时使用Kafka Sreams API和Processor API。我还想在处理器实现中将不同类型的对象写入不同主题,即在进程和标点符号上发射不同的对象强>。我已经看到有一个KIP-313 flatTransform可能会解决我的问题。
如果我使用:
inputStream.process(processorSupplier,,)
由于这是一个“终止”操作(其返回类型为void),我可以在处理器中使用内部的Kafka生产者。我还没有看到这样的实现方式,这是一种合理的方法吗,有副作用吗?
答案 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,以String
的形式发送到接收器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"));
}
}
}