From this example:

@SpringBootApplication
@EnableBinding(MyProcessor.class)
public class MultipleOutputsServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(MultipleOutputsServiceApplication.class, args);
    }

    @Autowired
    private MyProcessor processor;

    @StreamListener(MyProcessor.INPUT)
    public void routeValues(Integer val) {
        if (val < 10) {
            processor.anOutput()
                .send(message(val));
        } else {
            processor.anotherOutput()
                .send(message(val));
        }
    }

    private static final <T> Message<T> message(T val) {
        return MessageBuilder.withPayload(val)
            .build();
    }
}


MyProcessor界面:

public interface MyProcessor {
    String INPUT = "myInput";

    @Input
    SubscribableChannel myInput();

    @Output("myOutput")
    MessageChannel anOutput();

    @Output
    MessageChannel anotherOutput();
}


我的问题:

为什么在routeValues类中的方法MultipleOutputsServiceApplicationMyProcessor.INPUT而不是MyProcessor.myOutput注释(将此成员添加到MyProcessor接口之后)?

From the docsINPUT用于获取数据,而OUTPUT用于发送数据。为什么该示例相反,如果我将其反转,则无济于事?

最佳答案

该方法在我看来是正确的。它不必用@Output注释,因为您的方法没有返回类型,并且您正在以编程方式将输出发送到方法中的任意目的地(通过两个不同的输出绑定)。因此,您需要确保输出正确绑定,就像程序通过@EnableBinding(MyProcessor.class)正确绑定一样。您需要方法上的@StreamListener(MyProcessor.INPUT),因为MyProcessor.INPUT是StreamListener侦听的绑定。通过该输入获取数据后,您的代码将以编程方式接管向下游发送数据。话虽如此,有多种方法可以解决这些类型的用例。您也可以选择这样做。

    @StreamListener
                public void routeValues(@Input("input")SubscribableChannel input,
    @Output("mOutput") MessageChannel myOutput,
    @Output("output")MessageChannel output {

        input.subscribe(new MessageHandler() {
                        @Override
                        public void handleMessage(Message<?> message) throws MessagingException {

        int val = (int) message.getPayload();

        if (val < 10) {
            myOutput.send(message(val));
        }
        else {
            output.send(message(val));
       }
     }
}

10-01 02:10