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。