Java 来自单个主主题的多个流

Java 来自单个主主题的多个流,java,apache-kafka,apache-kafka-streams,Java,Apache Kafka,Apache Kafka Streams,如何从一个主主题生成多个流?当我这样做的时候: KStreamBuilder builder=new KStreamBuilder(); builder.stream(Serdes.String(),Serdes.String(),“master”) /*过滤逻辑*/ .to(Serdes.String(),Serdes.String(),“output1”); builder.stream(Serdes.String(),Serdes.String(),“master”) /*过滤逻辑*/ .

如何从一个主主题生成多个流?当我这样做的时候:

KStreamBuilder builder=new KStreamBuilder();
builder.stream(Serdes.String(),Serdes.String(),“master”)
/*过滤逻辑*/
.to(Serdes.String(),Serdes.String(),“output1”);
builder.stream(Serdes.String(),Serdes.String(),“master”)
/*过滤逻辑*/
.to(Serdes.String(),Serdes.String(),“output2”);
KafkaStreams streams=新的KafkaStreams(生成器,/*config*/);
streams.start();
我得到以下错误:

org.apache.kafka.streams.errors.TopologyBuilderException: Invalid topology building: Topic master has already been registered by another source.
    at org.apache.kafka.streams.processor.TopologyBuilder.addSource(TopologyBuilder.java:347)
    at org.apache.kafka.streams.kstream.KStreamBuilder.stream(KStreamBuilder.java:92)

我是否需要为“master”中的每个流创建另一个KafkaStreams实例?

您可以创建一个可重用的KStream:

KStream<String, String> inputStream = builder.stream(Serdes.String(), Serdes.String(), "master");

您还可以使用分支功能来实现这一点

KStream<String, String> inputStream = builder.stream(Serdes.String(), Serdes.String(), "master");

如果过滤器中没有重叠,还可以使用返回非重叠子流的
inputStream.branch()
。这不是只有在谓词不重叠时才起作用吗?
KStream<String, String> inputStream = builder.stream(Serdes.String(), Serdes.String(), "master");
final KStream<String, String>[] splitStream = inputStream.branch(new Predicate<String, String>() {
                        @Override
                        public boolean test(String key, String value) {
                            //write logic to filter 
                            return true;
                        },
                   new Predicate<String, String>() {
                        @Override
                        public boolean test(String key, String value) {
                            //write logic to filter 
                            return true;
                        },....
                    //you can write multiple predicate to filter inputStream 
                    });
splitStream[0].to("out_topic1");
splitStream[1].to("out_topic2");