DSL 和端点配置
所有 IntegrationFlowBuilder
EIP 方法都有一个变体,它应用 lambda 参数来提供 AbstractEndpoint
实例的选项:SmartLifecycle
、PollerMetadata
、request-handler-advice-chain
等。它们每一个都有泛型参数,因此可以让你在上下文中配置端点及其 MessageHandler
,如下例所示:
@Bean
public IntegrationFlow flow2() {
return IntegrationFlow.from(this.inputChannel)
.transformWith(t -> t
.transformer(new PayloadSerializingTransformer())
.autoStartup(false)
.id("payloadSerializingTransformer"))
.transformWith(t -> t
.transformer((Integer p) -> p * 2)
.advice(expressionAdvice()))
.get();
}
此外,EndpointSpec
提供了一个 id()
方法,让你可以用给定的 bean 名称注册一个端点 bean,而不是使用生成的名称。
如果 MessageHandler
作为 bean 被引用,那么如果 DSL 定义中存在 .advice()
方法,则任何现有的 adviceChain
配置将被覆盖:
@Bean
public TcpOutboundGateway tcpOut() {
TcpOutboundGateway gateway = new TcpOutboundGateway();
gateway.setConnectionFactory(cf());
gateway.setAdviceChain(Collections.singletonList(fooAdvice()));
return gateway;
}
@Bean
public IntegrationFlow clientTcpFlow() {
return f -> f
.handle(tcpOut(), e -> e.advice(testAdvice()))
.transform(Transformers.objectToString());
}
它们没有合并,在这种情况下只使用 testAdvice()
bean。