从同一个Java应用程序的两个实例中连续执行
我有一个名为'X'的Java应用程序。在Windows环境中,在给定的时间点可能会有多个应用程序实例。 我希望在应用程序'X'中顺序执行一段常见的代码,无论应用程序有多少个实例正在运行。这是可能的,可以实现的吗?任何建议都会有帮助。从同一个Java应用程序的两个实例中连续执行
实施例: - 我有一个名为Executor
类,其中一个方法将被调用。假设在任何给定的时间点可能有两个或更多的应用程序实例,我如何使方法从不同的实例顺序运行? 有没有像锁可以从两个实例访问,看看锁是否目前活跃?任何帮助?
回答:
据我所知,你做不到这一点很容易。你可以在进程之间实现TCP调用......但我不会建议它。
您应该更好地创建一个负责执行任务的外部进程,并通过向执行程序进程使用的JMS队列发送消息来执行所有要执行的任务。
...或者,也许你并不真的需要在同时运行多个进程,但你可能需要仅仅是将有多个线程在同一时间进行的事情,有一个线程专用于应用程序Executor
。这样,同步方法(或整个Executor
)就足够了,并且可以节省一些时间。
回答:
我认为你要找的是一个分布式锁(即从多个进程可见和可控的锁)。考虑到这一点,已经开发了相当多的第三方库,其中一些在本页面进行了讨论。
Distributed Lock Service
也有这个帖子的一些其他建议其使用文件的底层系统上的synchornization机制。
Cross process synchronization in Java
回答:
你不能用遗嘱执行人或类似的东西做到这一点,因为Java虚拟机将是独立的。
如果你真的需要多个独立实例之间同步的方法之一将是献给内部端口和执行应用程序中的简单的内部服务器。看看ServerSocket或RMI是全面解决方案,如果你需要广泛的沟通。第一个实例绑定到专用应用程序端口并成为主节点。所有稍后的实例都会找到应用程序端口,然后可以使用它来向主节点发送HTTP(或只是TCP/IP)调用,以报告他们需要执行的活动。
由于您只需要按顺序执行一些操作,任何从节点都可能会要求主服务器执行此操作,而不是执行自身操作。
这种方法的潜在问题是,如果用户关闭了主节点,也可能是复杂的实现方法另一个正在运行的节点如何能取代其位置。如果在任何时候只有一个节点处于活动状态(接收来自用户的输入),则在发现主站未响应并且端口未被占用之后,它可能扮演主节点的角色。
回答:
分布式队列,可用于此类负载平衡。您将一个或多个'请求消息'放入一个队列中,下一个可用的消费者应用程序将其选中并处理它。每个这样的请求消息都可以描述你要处理的任务。
这种类型的队列可以实现为JMS队列(例如使用ActiveMQ http://activemq.apache.org/),或者在Windows上还有MSMQ:https://msdn.microsoft.com/en-us/library/ms711472(v=vs.85).aspx。 如果性能是一个问题,你可以有C/C++ develepors,也是“共享内存队列”可能是有趣:shmemq API
以上是 从同一个Java应用程序的两个实例中连续执行 的全部内容, 来源链接: utcz.com/qa/262136.html