如何在Spring Cloud Stream中绑定多个主题

时间:2019-06-18 20:46:38

标签: apache-kafka spring-cloud-stream

阅读this article后,我可以阅读一个主题1并发布到另一个主题2。但是,当要从topic2读到topic3时,会收到类似“找不到需要一个名为'topic3'的bean的组件的错误。因此,我认为我还不了解该主题的绑定方式。

可行(仅出于学习目的):

/**
     * get sample data from topic, create objects and send them
     * @param s
     * @return
     */
    @StreamListener(Processor.INPUT)
    @SendTo(Processor.OUTPUT)
    public Object processStg1(String s) {
        String arr[] = s.split(";");
        if (arr[0].equalsIgnoreCase("Contract")) {
            Contract c = new Contract();
            c.setId(Integer.parseInt(arr[1]));
            c.setName(arr[2]);
            return c;
        }
        else if (arr[0].equalsIgnoreCase("Cashflow")) {
            Cashflow cf = new Cashflow();
            cf.setContractId(Integer.parseInt(arr[1]));
            cf.setDate(arr[2]);
            cf.setAmount(Float.parseFloat(arr[3]));
            return cf;
        }

        return ("ERROR: could not parse type");
    }

我了解我是通过application.properties绑定主题的。

spring.cloud.stream.bindings.output.destination=topic2
spring.cloud.stream.bindings.output.useNativeEncoding=true

spring.cloud.stream.bindings.input.destination=topic1
spring.cloud.stream.bindings.input.useNativeDecoding=true   

现在,我想在同一应用程序中阅读topic2的合同。 像

//无效

    @StreamListener(Processor.INPUT)
    public void processStg2(Contract c) {
       System.out.println("a contract was found");
    } 

//无效

@StreamListener
public void process(@Input("topic2") KStream<String, Contract> contracts) {
    System.out.println("Found contracts");
}

public interface ContractSink extends Sink {
    @Input("topic2")
    KStream<?, ?> inputStream();
}

一个组件需要一个找不到名为“ topic2”的bean。

1 个答案:

答案 0 :(得分:0)

最终,我找到了这个样本,这个样本困扰了我所有的问题:

https://github.com/toki79/kafkatraining/blob/master/src/main/java/tki/bigdata/steams/StreamsApplication.java