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