我正在创建一个分布式服务,我正在考虑在任何给定时间将一组耗时的操作限制在所有JVM的单个执行线程中。 (我将不得不最多处理3个JVM。)
我的初步调查指向了java.util.concurrent.Executors,java.util.concurrent.Semaphore。使用单例模式和Executors或Semaphore并不能保证跨多个JVM执行单个线程。
我正在寻找一个可以用来完成任务的java核心API(或至少是一个模式)。
P.S:我可以访问我现有项目中的ActiveMQ,我计划使用它来实现跨多个JVM机器的单线程执行,只有我没有其他选择。
答案 0 :(得分:2)
使用核心Java API没有简单的解决方案。如果3个JVM可以访问共享文件系统,则可以使用它来跟踪JVM中的状态。
所以基本上你做的事情就是在你开始昂贵的操作时创建一个锁文件并在结束时删除它。然后让每个JVM在开始操作之前检查是否存在此锁定文件。但是,这种方法存在一些问题,比如JVM在昂贵的操作过程中死亡并且文件未被删除。
对于像这样的问题和任何其他跨进程同步问题,ZooKeeper是一个很好的解决方案。如果有可能,请查看它。我认为解决问题比JMS队列更自然。