【问题标题】:Spring Integration Java DSL behavior of using multiple ".channel()"Spring Integration Java DSL 使用多个“.channel()”的行为
【发布时间】:2020-02-19 18:32:52
【问题描述】:

我正在测试 .channel() 方法的行为,并且我观察到了一些我不理解的事情。

@Bean
    public IntegrationFlow flow() {
        return IntegrationFlows.from("my-gateway")
                .channel("first-channel")
                .channel("second-channel")
                .get();
    }

如果我将打印语句放在“第一通道”中,它们不会被打印。但是一些业务逻辑似乎仍然发生。编辑:为服务激活器添加代码

@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 中通过多个渠道传递消息吗?还是所有的 IntegrationFlows 都限制在一个通道/ServiceActivator 上?

编辑:只有 second 打印语句出现在日志中。这是为什么呢?

【问题讨论】:

    标签: java spring-integration spring-integration-dsl


    【解决方案1】:

    不,您绝对可以构建具有多个通道的流程,甚至可以进行这样的配置。 bridge() 被框架放置在两者之间。您需要将消息从直接调用转储到某个队列,反之亦然。或者您的消息通道甚至可以基于 JMS、AMQP 等消息的一些持久存储。

    MessageChannel 抽象是 Spring Integration 中的一等公民,它来自 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

    【讨论】:

    • 但请记住,如果您在 first-channel 上添加另一个消费者(在另一个流程中 - IntegrationFlow.from("first-channel")...),消息将交替发送到两个通道和“其他”通道之间的桥梁消费者。默认情况下,使用多个消费者之间的循环分配。
    • 见 Gary 的评论。 .channel("first-channel") 表示具有循环策略的默认 DirectChannel。由于您在流中放置了另一个频道,因此会添加一个 bridge() 作为该频道的订阅者。但是,您拥有@ServiceActivator(inputChannel = "first-channel"),它成为同一频道的第二个订阅者。根据循环行为,第一条消息发送到第一个订阅者,第二个发送到第二个订阅者,依此类推。因此,您将自己添加第二个订阅者与@ServiceActivator 混淆了。
    • 第二个频道只是您的流程的结束,上面没有其他订阅者 - 只有您的 @ServiceActivator(inputChannel = "second-channel")
    • 好。让我们考虑一下:stackoverflow.com/help/someone-answers!
    • 正确。您缺少通道本身只是端点之间的管道的部分。如果您谈论像@ServiceActivator 这样的注释,那么您不需要IntegrationFlow。您已经使用这些注释构建了它。或者代替注释配置IntegraionFlow中的所有内容。
    猜你喜欢
    • 1970-01-01
    • 2015-11-30
    • 2015-01-29
    • 2016-06-10
    • 2018-09-13
    • 1970-01-01
    • 2022-07-11
    • 2018-08-18
    • 1970-01-01
    相关资源
    最近更新 更多