Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 与Kafka Spring云流的多个@EnableBinding_Spring Boot_Apache Kafka_Apache Kafka Streams_Spring Cloud Stream - Fatal编程技术网

Spring boot 与Kafka Spring云流的多个@EnableBinding

Spring boot 与Kafka Spring云流的多个@EnableBinding,spring-boot,apache-kafka,apache-kafka-streams,spring-cloud-stream,Spring Boot,Apache Kafka,Apache Kafka Streams,Spring Cloud Stream,我正在尝试设置一个Spring Boot应用程序,以侦听Kafka 我用的是卡夫卡流活页夹 只需一个简单的@EnableBinding @EnableBinding(StreamExample.StreamProcessor.class) public class StreamExample { @StreamListener(StreamProcessor.INPUT) @SendTo(StreamProcessor.OUTPUT) public KStream<

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

我用的是卡夫卡流活页夹

只需一个简单的
@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();
    }
}
一切正常

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

以下订阅的主题未分配给任何成员:[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();
    }
}
@EnableBinding(StreamExampleBindingTwo.StreamProcessor.class)
公共类StreamExampleBindingTwo{
@StreamListener(StreamProcessor.INPUT)
@发送到(StreamProcessor.OUTPUT)
公共KStream进程(KStream输入){
logger.info(“流监听绑定二”);
返回输入
.peek(((key,value)->logger.info(“key={}value={},key,value));
}
接口流处理器{
String INPUT=“INPUT_2”;
String OUTPUT=“OUTPUT_2”;
@输入(输入)
KStream输入();
@输出(输出)
KStream outputProcessed();
}
}
我错过了什么?我不能在同一个应用程序中使用多个输入主题和多个输出吗?有与应用程序相关的内容。名称?

请尝试

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

我刚试用了一个应用程序,效果很好。当同一应用程序中有多个处理器时,需要确保每个处理器都有自己的应用程序id。 请参见下面我如何在
application.yml
中为两个输入设置两个不同的应用程序id

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

@SpringBootApplication
@EnableBinding({So54522918Application.StreamProcessor1.class, So54522918Application.StreamProcessor2.class})
public class So54522918Application {

    public static void main(String[] args) {
        SpringApplication.run(So54522918Application.class, args);
    }

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

        System.out.println("Stream listening");

        return input
                .peek(((key, value) -> System.out.println("key = " + key +", value = " + value)));
    }

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

        System.out.println("Stream listening binding two");

        return input
                .peek(((key, value) -> System.out.println("key = " + key +", value = " + value)));
    }

    interface StreamProcessor1 {

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

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

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

    interface StreamProcessor2 {

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

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

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

}

错误仍然存在,我只收到设置新分配的分区[my-topic3]哦,我没有注意到你正在使用
KStream
-我对此不太熟悉。谢谢,但是文档中哪里说我们需要2个应用程序ID?请参阅本节中的
applicationId
:你说得对,谢谢。我认为文件应该比这更清楚。。。阅读SpringCloudStream文档()这一点没有提到。。。。再次感谢大家!
@SpringBootApplication
@EnableBinding({So54522918Application.StreamProcessor1.class, So54522918Application.StreamProcessor2.class})
public class So54522918Application {

    public static void main(String[] args) {
        SpringApplication.run(So54522918Application.class, args);
    }

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

        System.out.println("Stream listening");

        return input
                .peek(((key, value) -> System.out.println("key = " + key +", value = " + value)));
    }

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

        System.out.println("Stream listening binding two");

        return input
                .peek(((key, value) -> System.out.println("key = " + key +", value = " + value)));
    }

    interface StreamProcessor1 {

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

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

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

    interface StreamProcessor2 {

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

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

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

}
spring.cloud.stream.kafka.streams.binder.configuration.commit.interval.ms: 1000
spring.cloud.stream.kafka.streams:
  binder.configuration:
    default.key.serde: org.apache.kafka.common.serialization.Serdes$StringSerde
    default.value.serde: org.apache.kafka.common.serialization.Serdes$StringSerde
  bindings.input_1.consumer.application-id: process-1
  bindings.input_2.consumer.application-id: process-2
spring.cloud.stream.bindings.input_1:
  destination: mytopic1
spring.cloud.stream.bindings.output_1:
  destination: mytopic2
spring.cloud.stream.bindings.input_2:
  destination: mytopic3
spring.cloud.stream.bindings.output_2:
  destination: mytopic4