Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在多个JVM上维护单个实例_Java_Synchronization_Jvm_Cluster Computing_Distributed - Fatal编程技术网

Java 在多个JVM上维护单个实例

Java 在多个JVM上维护单个实例,java,synchronization,jvm,cluster-computing,distributed,Java,Synchronization,Jvm,Cluster Computing,Distributed,我正在创建一个分布式服务,我正在考虑将一组耗时的操作限制为在任何给定时间跨所有JVM执行的单个线程。(我最多需要处理3个JVM) 我最初的调查指向java.util.concurrent.Executors,java.util.concurrent.Semaphore。使用单例模式和执行器或信号量并不能保证跨多个JVM执行单个线程 我正在寻找一个java核心API(或者至少是一个模式),可以用来完成我的任务 注:我可以在我现有的项目中访问ActiveMQ,我计划使用它来实现跨多台JVM机器的单线

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

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

我正在寻找一个java核心API(或者至少是一个模式),可以用来完成我的任务


注:我可以在我现有的项目中访问ActiveMQ,我计划使用它来实现跨多台JVM机器的单线程执行,除非我别无选择。

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

因此,基本上,您可以在启动昂贵的操作时创建一个锁文件,并在结束时将其删除。然后让每个JVM在开始操作之前检查是否存在该锁文件。然而,这种方法存在一些问题,例如如果JVM在昂贵操作的中间死亡,文件没有被删除,则如何?
是解决此类问题和任何其他跨进程同步问题的好方法。如果这对你来说是一种可能性,请检查一下。我认为这是一种比JMS队列更自然的解决问题的方法。

这是相当困难的,因为JVM彼此不了解。内部
同步
对您没有帮助。我建议使用
ServerSocket
,这样一旦一个JVM打开了该套接字,其他JVM就无法打开它。我认为JMS是最好的选择。如果您真的不想将JMSIs作为一个应用服务器使用,或者这是一个独立的应用程序,您可以滚动自己的队列(将工作记录存储在db表中,然后使用一个单独的应用程序来处理该队列)?@bmorris591,我将试一试,看看它是如何运行的。@Blake,ActiveMQ是一个JMS实现,如果我没有java核心API来帮助我,我计划使用它。我选择ActiveMQ是因为我熟悉它。JVM总是在不同的文件系统上。这是为了提供高可用性功能。如果JVM可以访问公共共享文件系统,那么您提到的死JVM情况可以通过配置最大超时和查看锁文件的最后修改时间来处理。动物园管理员看起来很有前途。