以下DSL流的代码中的最后一个元素是服务激活器(.handle
方法)。
我可以在此处订阅默认的直接输出频道吗?如果我理解正确,则必须存在输出通道
我知道我可以在末尾添加.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);
答案 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
,否则没有默认轮询器。您可能会使用一些可以为您代劳的库。