云环境下基于spring集成的JMS消息处理

云环境下基于spring集成的JMS消息处理,spring,spring-integration,spring-cloud,spring-integration-jdbc,Spring,Spring Integration,Spring Cloud,Spring Integration Jdbc,我目前正在尝试重构JMS消息的处理,以在分布式/云环境中工作。为了更好地进行重试和错误处理,消息首先使用JPA实体存储到数据库中,然后由spring integration JPA入站适配器读取。只要我的服务只有一个实例在运行,这就可以正常工作。但是,当多个实例正在运行时,即使在持久化消息上引入了处理状态,这些实例也会尝试处理同一消息 我已经尝试将JMS消息保存在JDBC消息存储中,但是,接下来我必须定义一个组标识符,根据该标识符,实例可以选择一条消息,这实际上是不可能的,因为实例的数量是动态的

我目前正在尝试重构JMS消息的处理,以在分布式/云环境中工作。为了更好地进行重试和错误处理,消息首先使用JPA实体存储到数据库中,然后由spring integration JPA入站适配器读取。只要我的服务只有一个实例在运行,这就可以正常工作。但是,当多个实例正在运行时,即使在持久化消息上引入了处理状态,这些实例也会尝试处理同一消息

我已经尝试将JMS消息保存在JDBC消息存储中,但是,接下来我必须定义一个组标识符,根据该标识符,实例可以选择一条消息,这实际上是不可能的,因为实例的数量是动态的,并且我无法为每个实例分配组id。另一种可能是某种分布式锁,带有锁注册表,但我无法做到这一点

您对我如何使用spring integration最好地实现以下需求有何提示/建议:

  • JMS消息应该被持久化
  • 任何实例都可以拾取消息并对其进行处理
  • 如果处理失败,将重试x次(也可以由另一个实例重试)
  • 如果实例在处理过程中崩溃或被杀死,则消息不得丢失
是否有一些spring云组件可能会有所帮助?
我对我应该朝哪个方向走的每一个提示都很满意。

为什么不直接使用JMS呢?使用RDBMS作为消息队列是一种反模式,JMS隐式支持您的用例。这是我最初的想法,但我无法真正控制重试行为。在处理过程中,我必须调用其他可能不可用的服务,并且无法完成处理,因此我希望在重试之前等待一段时间。但是,JMSListener中的失败和回滚会导致立即再次读取相同的消息。这不是JMS规范的一部分,但一些代理支持在重试消息之前添加延迟。例如。查看您的代理的文档。我们正在使用IBM MQ,我与这里的负责团队进行了检查,他们告诉我,使用IBM MQ是不可能的。这就是为什么我选择将其存储在DB中的解决方案。为什么不直接使用JMS呢?使用RDBMS作为消息队列是一种反模式,JMS隐式支持您的用例。这是我最初的想法,但我无法真正控制重试行为。在处理过程中,我必须调用其他可能不可用的服务,并且无法完成处理,因此我希望在重试之前等待一段时间。但是,JMSListener中的失败和回滚会导致立即再次读取相同的消息。这不是JMS规范的一部分,但一些代理支持在重试消息之前添加延迟。例如。查看您的代理的文档。我们正在使用IBM MQ,我与这里的负责团队进行了检查,他们告诉我,使用IBM MQ是不可能的。这就是为什么我选择将其存储在DB中的解决方案。