Java Spring集成轮询多台服务器上的入站通道适配器

Java Spring集成轮询多台服务器上的入站通道适配器,java,spring,oracle,mongodb,spring-integration,Java,Spring,Oracle,Mongodb,Spring Integration,我们有一个Spring集成应用程序,它正在轮询一个mongodb:inbound channel adapter,如下所示: <int-mongodb:inbound-channel-adapter channel="n2s.mongoResults" collection-name="entities" query="{_id: {$rege

我们有一个Spring集成应用程序,它正在轮询一个
mongodb:inbound channel adapter
,如下所示:

<int-mongodb:inbound-channel-adapter channel="n2s.mongoResults"
                                     collection-name="entities"
                                     query="{_id: {$regex: 'mpl/objectives'}})">
    <!-- Run every 15 minutes -->
    <int:poller fixed-rate="900000"/>
</int-mongodb:inbound-channel-adapter>

一切正常。但是,此应用程序部署到集群,因此多个服务器运行同一轮询器。我们希望协调这些服务器,以便只有一台运行管道

当然,服务器之间互不了解,所以我们可能需要通过数据库中的锁定机制来协调它们。对如何实现这一目标有何建议

笔记: 在此工作流中,我们可以访问MongoDB数据库和Oracle数据库。从工作流的角度来看,锁定Oracle数据库更有意义

如果所有服务器都执行轮询步骤,然后一个服务器锁定以实际处理记录(如果这更容易实现的话),那么这也没关系

对如何实现这一目标有何建议

您可以使用Zookeeper之类的分布式锁定工具。另一种选择是从一个简单的固定触发器更改为类似Quartz的调度框架,该框架将确保作业仅在单个节点上执行

如果所有服务器都执行轮询步骤,然后只有一个服务器执行轮询步骤,就可以了 锁定以实际处理记录,如果这更容易实现的话


是的,那就是我要做的。我认为这是迄今为止最简单的方法。请参阅。

有几个选项,包括:

设置
auto startup=“false”
并使用一些管理工具来监视服务器,并确保只有一个适配器正在运行(您可以使用
控制总线或JMX来启动/停止适配器

在SpringXD容器中运行应用程序;设置源(包含mongo适配器)的模块计数,XD管理员将确保实例正在运行。它使用Zookeeper管理状态

使用分布式锁确保只有一个实例处理消息。Spring Integration本身带有一个
RedisLockRegistry
,用于此类操作,或者您可以使用任何分布式锁机制