通知单独的JVM执行任务

时间:2018-08-11 18:12:39

标签: java single-instance

因此,我正在制作一个程序,一次只能运行一个实例,并且使用此solution

但是现在我要这样做,以便如果用户尝试启动另一个实例,它将消耗该尝试并通知当前实例以显示其gui。

目前,我正在考虑通过使用文件来执行此操作。启动第二个实例后,将创建一个名为show.stage的文件。当另一个实例检测到该文件时,它将显示其gui并删除该文件。

我知道这可行,但是我想知道是否有更优雅的方法可以做到这一点。

我可以通过某种方式设置一个环境标志,以便其他实例可以通过套接字侦听器进行检查或通过套接字侦听器通知它,尽管其他人似乎不希望这样做。我觉得创建文件将是最简单,最可靠的方法,但是我愿意接受任何建议

该程序将在正常的Windows上运行。

3 个答案:

答案 0 :(得分:1)

如果您不想使用锁定文件(我认为这是一个很好的解决方案),则可以使用套接字。

让您的应用程序创建一个套接字服务器并在localhost的某个端口上进行侦听。如果无法监听,则意味着其他人已经在监听该端口-最有可能是您的应用程序的另一个实例。您甚至可以连接到该端口并发送消息,以通知主实例第二个实例已尝试生成。

警告是,如果另一个应用程序合法使用该端口,则您的应用程序将永远无法运行-但我发现这种情况不太可能发生。

答案 1 :(得分:1)

有很多方法可以解决这个问题:

  • 您已经知道,文件系统可以用作两个jvm之间的通信通道。但这仅适用于在同一服务器上运行的jvm。
  • 因此,已经建议的套接字解​​决方案使您能够(以后)将相同的解决方案应用于分布式环境。缺点是您必须在非常低的级别上实现协议。
  • 过去,人们经常转向消息总线解决方案(例如,以ActiveMQ为例)
  • 在2018年,另一种选择是实现一个简单的Restful API,例如使用jaxrs和jersey。

如上所述:您要为此付出的努力取决于您的要求。将使用多长时间?您的解决方案将增长并必须扩展到多台服务器的可能性有多大?

答案 2 :(得分:-1)

尝试使用x86-64作为锁定,并像Sandy Bridge这样处理单个消息作为通信工具