Spring Integration - 跨步骤共享锁

Posted

技术标签:

【中文标题】Spring Integration - 跨步骤共享锁【英文标题】:Spring Integration - Sharing lock across steps 【发布时间】:2018-02-13 08:44:58 【问题描述】:

我有以下设置:许多设备通过 HTTP 将数据发送到我的后端,其中一个接收器组件正在运行多个实例。我需要处理数据,然后将其发送给另一个外部合作伙伴,该合作伙伴需要这些数据按时间戳顺序。所以我想出了以下架构:

    有 n 个接收器实例正在运行,它们前面有一个负载均衡器,因此它们有可能从所有设备获取数据。这些实例通过添加一些信息来处理每个传入的数据,然后将数据放入 Redis 排序集(每个设备都有一个)。在此之后,他们会发送一条消息(通过 Redis),说明当前集合中有多少数据条目。

    有 m 个处理实例,其任务是将数据发送到外部伙伴。他们监听接收者发送的消息,如果集合中的条目数大于某个阈值,他们从队列中检索数据,添加一些其他信息,然后将其发送给外部伙伴。

我遇到的问题是时间戳顺序要求。我有 n 和 m 个实例,每个实例都运行多个线程。对于所有从接收者接收消息的处理实例,我考虑从集合中检索数据并将其发送到共享 Redis 锁内的外部合作伙伴,用于与消息关联的队列(以及相应的设备)。但是目前有多个 Spring Integration 步骤是处理流程的一部分:从队列中获取数据 -> 将其转换为发送 -> 通过 HTTP 出站通道发送。我考虑过使用在第一步中获得的锁(从队列中获取数据)并在最后一步中释放(在通过出站通道发送之后)。如果发生错误,锁将在错误处理步骤中被释放。

有什么替代方案的想法吗?我正在考虑通过剩余的流程将锁作为消息头的一部分发送,然后在最后释放它。

【问题讨论】:

【参考方案1】:

既然您说的是订购,您应该考虑在发送给外部合作伙伴之前使用PriorityChannel 或Resequencer 重新订购记录。 两者都可以配置共享MessageStore

【讨论】:

以上是关于Spring Integration - 跨步骤共享锁的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis(3.2.3) - Integration with Spring

INTEGRATION TESTING WITH SPRING AND JUNIT

Spring Integration Dispatcher 没有频道订阅者

使用 Spring Integration HttpInbound 示例

spring-integration-file 的 junit 测试用例

了解spring-integration service-activator