与Kafka Spring Cloud Stream多个@EnableBinding

时间:2019-02-04 19:19:48

标签: spring-boot apache-kafka apache-kafka-streams spring-cloud-stream

我正在尝试设置一个侦听Kafka的Spring Boot应用程序。

我正在使用Kafka Streams Binder。

一个简单的@EnableBinding

@EnableBinding(StreamExample.StreamProcessor.class)
public class StreamExample {

    @StreamListener(StreamProcessor.INPUT)
    @SendTo(StreamProcessor.OUTPUT)
    public KStream<String, String> process(KStream<String, String> input) {

        logger.info("Stream listening");

        return input
                .peek(((key, value) -> logger.info("key = {} value = {}", key, value)));
    }

    interface StreamProcessor {

        String INPUT = "input_1";
        String OUTPUT = "output_1";

        @Input(INPUT)
        KStream<String, String> input();

        @Output(OUTPUT)
        KStream<String, String> outputProcessed();
    }
}

application.yml

spring:
  cloud:
    stream:
      kafka:
        streams:
          binder:
            brokers: localhost:29092
      bindings:
         input_1:
           destination: mytopic1
           group: readgroup
         output_1:
           destination: mytopic2
         input_2:
           destination: mytopic3
           group: readgroup
         output_2:
           destination: mytopic4
  application:
    name: stream_s1000_app

一切正常。

但是,如果我尝试添加具有其他绑定的第二个类,则会发生以下错误:

以下订阅的主题未分配给任何成员:[mytopic1]

第二个绑定示例:

@EnableBinding(StreamExampleBindingTwo.StreamProcessor.class)
public class StreamExampleBindingTwo {

    @StreamListener(StreamProcessor.INPUT)
    @SendTo(StreamProcessor.OUTPUT)
    public KStream<String, String> process(KStream<String, String> input) {

        logger.info("Stream listening binding two");

        return input
                .peek(((key, value) -> logger.info("key = {} value = {}", key, value)));
    }

    interface StreamProcessor {

        String INPUT = "input_2";
        String OUTPUT = "output_2";

        @Input(INPUT)
        KStream<String, String> input();

        @Output(OUTPUT)
        KStream<String, String> outputProcessed();
    }
}

我缺少什么?我不能在同一应用程序中使用多个输入主题和多个输出吗?是否有与application.name相关的内容?

2 个答案:

答案 0 :(得分:4)

我刚刚尝试了一个应用程序,但是效果很好。当同一应用程序中有多个处理器时,需要确保每个处理器都有自己的应用程序ID。 参见下面的内容,var divElement = $('.container').find('.row').sort(sortMe); function sortMe(a, b) { return a.className.match(/col-md-(\d)/)[1] - b.className.match(/col-md-(\d)/)[1]; } $('.container').append(divElement); 中的两个输入如何有2个不同的应用程序ID。

我看到两个处理器都已登录到控制台。此外,还看到了有关输出主题的消息。

Select * from yourtable

application.yml的相关部分

application.yml

答案 1 :(得分:0)

尝试

@EnableBinding( { StreamExample.StreamProcessor.class, StreamExampleBindingTwo.StreamProcessor.class })