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。