0

我正在创建一个分布式服务,并且正在考虑在任何给定时间将一组耗时的操作限制为跨所有 JVM 的单个执行线程。(我将不得不处理最多 3 个 JVM)。

我最初的调查指向 java.util.concurrent.Executors 和 java.util.concurrent.Semaphore。使用单例模式和 Executors 或 Semaphore 并不能保证我可以跨多个 JVM 执行单个线程。

我正在寻找可以用来完成任务的 java 核心 API(或至少是 Pattern)。

PS:我可以在我现有的项目中访问 ActiveMQ,我打算使用它来实现跨多个 JVM 机器的单线程执行,只有在我没有其他选择的情况下。

4

1 回答 1

2

使用核心 java API 没有简单的解决方案。如果 3 个 JVM 可以访问共享文件系统,您可以使用它来跟踪 JVM 之间的状态。

所以基本上你会在开始昂贵的操作时创建一个锁定文件并在结束时将其删除。然后让每个 JVM 在开始操作之前检查这个锁文件是否存在。但是,这种方法存在一些问题,例如如果 JVM 在昂贵的操作中死机并且文件没有被删除,该怎么办。

ZooKeeper是解决此类问题和任何其他跨进程同步问题的好方法。看看这是否适合您。我认为这是一种比 JMS 队列更自然的解决问题的方法。

于 2013-04-01T16:55:29.590 回答