Spring 集成 Java 使用多个“.channel()”的 DSL 行为
Spring Integration Java DSL behavior of using multiple ".channel()"
我正在测试 .channel() 方法的行为,我观察到了一些我不理解的事情。
@Bean
public IntegrationFlow flow() {
return IntegrationFlows.from("my-gateway")
.channel("first-channel")
.channel("second-channel")
.get();
}
如果我在 "first-channel" 中放置打印语句,则不会打印它们。但是一些业务逻辑似乎仍然会发生。编辑:为服务激活器添加了代码
@ServiceActivator(inputChannel = "first-channel")
public Message testFlow(Message message) {
System.out.println("Entered First Channel " + "\n" + "Message Header: " + message.getHeaders() + "\n" + "Message Payload" + "\n" + message.getPayload());
return message;
}
@ServiceActivator(inputChannel = "second-channel")
public Message testFlow(Message message) {
System.out.println("Entered Second Channel " + "\n" + "Message Header: " + message.getHeaders() + "\n" + "Message Payload" + "\n" + message.getPayload());
return message;
}
application.properties:
logging.level.root=TRACE
我可以在同一个 java dsl IntegrationFlow 中通过多个渠道传递消息吗?还是每个 IntegrationFlow 都限制为一个 channel/ServiceActivator?
编辑:只有 second 打印语句出现在日志中。这是为什么?
不,您绝对可以构建具有多个通道的流程,您甚至可以拥有这样的配置。 bridge()
由框架内部放置在 then 之间。图像您需要将直接调用的消息转储到某个队列,反之亦然。或者您的消息通道甚至可以基于 JMS、AMQP 等消息的某些持久存储。
MessageChannel
抽象是 Spring 集成中的第一个 class 公民,它来自 EIP 中描述的规范集成模型:https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessageChannel.html
当看到这些端点是如何松散耦合时,端点之间的这种实现的重要性变得很方便,目标 MessageChannel
实现可能会要求我们在流程中间进行一些行为更改。
作为论据的另一个方面是ChannelInterceptor
拥有像您定义的那样的流程是有效的。您可能仍然只有频道名称的定义,但 ChannelInterceptor
可以根据其模式选项全局应用于它们。
反之亦然:您可以仅使用端点声明一个流,并且框架在内部将通道放置在两者之间。
请参阅文档了解更多信息:https://docs.spring.io/spring-integration/docs/5.2.3.RELEASE/reference/html/dsl.html#java-dsl
我正在测试 .channel() 方法的行为,我观察到了一些我不理解的事情。
@Bean
public IntegrationFlow flow() {
return IntegrationFlows.from("my-gateway")
.channel("first-channel")
.channel("second-channel")
.get();
}
如果我在 "first-channel" 中放置打印语句,则不会打印它们。但是一些业务逻辑似乎仍然会发生。编辑:为服务激活器添加了代码
@ServiceActivator(inputChannel = "first-channel")
public Message testFlow(Message message) {
System.out.println("Entered First Channel " + "\n" + "Message Header: " + message.getHeaders() + "\n" + "Message Payload" + "\n" + message.getPayload());
return message;
}
@ServiceActivator(inputChannel = "second-channel")
public Message testFlow(Message message) {
System.out.println("Entered Second Channel " + "\n" + "Message Header: " + message.getHeaders() + "\n" + "Message Payload" + "\n" + message.getPayload());
return message;
}
application.properties:
logging.level.root=TRACE
我可以在同一个 java dsl IntegrationFlow 中通过多个渠道传递消息吗?还是每个 IntegrationFlow 都限制为一个 channel/ServiceActivator?
编辑:只有 second 打印语句出现在日志中。这是为什么?
不,您绝对可以构建具有多个通道的流程,您甚至可以拥有这样的配置。 bridge()
由框架内部放置在 then 之间。图像您需要将直接调用的消息转储到某个队列,反之亦然。或者您的消息通道甚至可以基于 JMS、AMQP 等消息的某些持久存储。
MessageChannel
抽象是 Spring 集成中的第一个 class 公民,它来自 EIP 中描述的规范集成模型:https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessageChannel.html
当看到这些端点是如何松散耦合时,端点之间的这种实现的重要性变得很方便,目标 MessageChannel
实现可能会要求我们在流程中间进行一些行为更改。
作为论据的另一个方面是ChannelInterceptor
拥有像您定义的那样的流程是有效的。您可能仍然只有频道名称的定义,但 ChannelInterceptor
可以根据其模式选项全局应用于它们。
反之亦然:您可以仅使用端点声明一个流,并且框架在内部将通道放置在两者之间。
请参阅文档了解更多信息:https://docs.spring.io/spring-integration/docs/5.2.3.RELEASE/reference/html/dsl.html#java-dsl