【问题标题】:Spring Integration and the Message Bridge PatternSpring Integration 和消息桥接模式
【发布时间】:2022-12-09 23:35:29
【问题描述】:
学习 Spring 集成。我试图了解 IntegrationFlow DSL 及其 to(IntegrationFlow) 方法的使用。
这似乎允许我们将流程 1 的结尾与流程 2 的开头进行菊花链连接。
这是 DSL 的实现吗消息桥模式,通道在哪里相互连接?如果不是,这与消息桥有何不同?它是否类似于 Apache Camel 中的 direct: 和 seda: 端点,即一种将路由拼接在一起的方式?
【问题讨论】:
标签:
spring-integration
enterprise-integration
【解决方案1】:
是的,我们可以那样对待它,但从技术上讲,它只是更多高级消息抽象的组合。没有作为单个顶级组件的 EIP Message Bridge pattern 实现。
让我们客观地看一下:
如何连接多个消息传递系统,以便在一个系统上可用的消息在另一个系统上也可用?
使用消息传递桥(消息传递系统之间的连接)在系统之间复制消息。
因此,假设我们需要将数据从 Apache Kafka 主题传输到某个 IBM MQ 队列。对于 Kafka,我们使用 KafkaMessageDrivenChannelAdapter,对于 IBM MQ - JmsSendingMessageHandler。我们通过DirectChannel 连接它们,其余的由内部(反)序列化器完成,将 Kafka 记录重新映射到 JMS 消息中。这种方法是否实现了上述模式?我想是的。使用不同的通道适配器,我们可以实现许多将数据从一个来源传输到另一个来源的用例。
Message Bridge 证实了我们的假设:
消息传递桥是一组通道适配器。
现在关于to(IntegrationFlow) 运营商。这只是一个方便的 API,用于在不同的逻辑、可重用部分之间分解您的配置。在运行时,我们没有任何 IntegrationFlows 交互:只有端点通过它们之间的通道交换消息。
是的,您可以将 Camel 的 direct: 和 seda: 视为 Spring Integration 方面的 MessageChannel 抽象。是的,我们可以说这种通过通道的分离是我们之前谈到的一座桥梁。但就 Spring Integration 而言,有时没有理由分离逻辑,人们只是这样做:
IntegrationFlow.from(Kafka.messageDrivenChannelAdapter())
.handle(Jms.outboundAdapter())
.get();
这是我们以前见过的桥吗?我猜是。即使我们没有明确的通道定义,它仍然存在,由框架自动创建。