如果DSL流以endpoin结尾,是否有默认输出通道?

时间:2018-11-06 13:02:58

标签: spring-integration spring-integration-dsl

以下DSL流的代码中的最后一个元素是服务激活器(.handle方法)。 我可以在此处订阅默认的直接输出频道吗?如果我理解正确,则必须存在输出通道enter image description here

我知道我可以在末尾添加.channel("name"),但问题是如果未明确编写,该怎么办。 这是代码:

@SpringBootApplication
@IntegrationComponentScan
public class QueueChannelResearch {

    @Bean
    public IntegrationFlow lambdaFlow() {
        return f -> f.channel(c -> c.queue(50))
            .handle(System.out::println);
    }

    public static void main(String[] args) {
        ConfigurableApplicationContext ctx = SpringApplication.run(QueueChannelResearch.class, args);

        MessageChannel inputChannel = ctx.getBean("lambdaFlow.input", MessageChannel.class);

        for (int i = 0; i < 1000; i++) {
            inputChannel.send(MessageBuilder.withPayload("w" + i)
                .build());
        }

        ctx.close();

    }

另一个问题是关于QueueChannel。如果注释为handle(),程序将挂起;如果注释为取消,则程序将结束。这是否意味着handle()在其之前添加了默认的轮询器?

 return f -> f.channel(c -> c.queue(50));
       //         .handle(System.out::println);

1 个答案:

答案 0 :(得分:1)

不,那是行不通的。

请回想一下,集成流程是一种filter-pipes体系结构,当前步骤的结果将被发送到下一个步骤。由于您使用.handle(System.out::println),因此该println()方法调用没有输出,因此不会返回任何内容来构建要发送到下一个通道的消息(如果有)。因此,流程在此处停止。返回类型void或返回值null是服务激活程序停止流的信号。将您的.handle(System.out::println)视为XML配置中的<outbound-channel-adapter>

是的:没有任何默认通道,除非您事先通过replyChannel标头定义了一个。再说一遍:您的服务方法必须返回有价值的东西。

服务激活器的输出是可选,这就是为什么我们没有为出站通道适配器引入额外的运算符的原因。

关于QueueChannel的问题最好在单独的SO线程中处理。除非您将一个默认轮询器声明为PollerMetadata.DEFAULT_POLLER,否则没有默认轮询器。您可能会使用一些可以为您代劳的库。