我有一个名为' X '的Java应用程序。在Windows环境中,在给定的时间点,可能存在多个应用程序实例。 我希望在Application' X '中按顺序执行一段共同的代码。无论运行多少个应用程序实例。这是可能的,可以实现吗?任何建议都会有所帮助。
示例: - 我有一个名为Executor
的类,其中将调用方法execute()
。假设在任何给定的时间点可能有两个或更多个应用程序实例,我怎么能让方法execute()
从不同的实例顺序运行?
是否有类似锁的东西可以从两个实例访问并查看锁当前是否处于活动状态?有什么帮助吗?
答案 0 :(得分:1)
我认为你所寻找的是一个分布式锁(即一个可以从许多进程中看到和控制的锁)。考虑到这一点,已经开发了很多第三方库,其中一些在本页讨论。
本文还有其他一些建议,它们使用底层系统上的文件作为同步机制。
答案 1 :(得分:0)
据我所知,你不能轻易做到这一点。你可以在进程之间实现TCP调用......但是我不建议它。
您最好创建一个负责执行任务的外部流程,并通过向执行程序进程将使用的JMS队列发送消息来请求执行所有任务。
...或许你真的不需要同时运行多个进程,但你可能需要的只是一个应用程序,它可以让多个线程在同一时间执行任务并且有一个专用的线程到Executor
。这样,同步execute()
方法(或整个Executor
)就足够了,并且可以节省一些时间。
答案 2 :(得分:0)
使用Executors或类似的东西无法实现这一点,因为Java虚拟机将是独立的。
如果确实需要在多个独立实例之间进行同步,其中一种方法是专用内部端口并在应用程序中实现简单的内部服务器。如果您需要广泛的沟通,请查看ServerSocket或RMI是完整的解决方案。第一个实例绑定到专用应用程序端口并成为主节点。所有后来的实例都会找到应用程序端口,但随后可以使用它来向主节点发出HTTP(或仅TCP / IP)调用,报告他们需要执行的活动。
由于您只需要按顺序执行某些操作,因此任何从属节点都可能要求master执行此操作而不是执行自身。
此方法的一个潜在问题是,如果用户关闭主节点,则实现另一个运行节点可以取代其位置的方法可能很复杂。如果任何时候只有一个节点处于活动状态(接收来自用户的输入),则在发现主节点没有响应然后端口未被占用后,它可能会担任主节点的角色。
答案 3 :(得分:0)
分布式队列可用于此类负载平衡。您将一个或多个“请求消息”放入队列,然后下一个可用的消费者应用程序将其拾取并处理它。每条此类请求消息都可以描述您要处理的任务。
这种类型的队列可以实现为JMS队列(例如使用ActiveMQ http://activemq.apache.org/),或者在Windows上也有MSMQ:https://msdn.microsoft.com/en-us/library/ms711472(v=vs.85).aspx。 如果性能是一个问题并且您可以使用C / C ++开发者,那么“共享内存队列”也可能很有趣:shmemq API