Java 通知单独的JVM执行任务

Java 通知单独的JVM执行任务,java,single-instance,Java,Single Instance,因此,我正在制作一个一次只运行一个实例的程序,并使用这个 但是,现在我想这样做,如果用户尝试启动另一个实例,它将使用该尝试并通知当前实例显示其gui 目前我正在考虑使用一个文件来实现这一点。启动第二个实例后,将创建名为show.stage的文件。当另一个实例检测到该文件时,它将显示其gui并删除该文件 我知道这是可行的,但我想知道是否有更优雅的方式来做到这一点 我可以告诉您如何设置一个环境标志,让其他实例可以检查或通过套接字侦听器通知它,尽管其他人似乎不鼓励这样做。我觉得创建文件将是最简单、最健

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

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

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

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

我可以告诉您如何设置一个环境标志,让其他实例可以检查或通过套接字侦听器通知它,尽管其他人似乎不鼓励这样做。我觉得创建文件将是最简单、最健壮的方法,但我愿意接受任何建议


此程序将在普通windows上运行。

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

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


需要注意的是,如果另一个应用程序合法使用该端口,您的应用程序将永远无法运行-但我发现这不太可能发生。

有很多方法可以做到这一点:

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

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

试着使用
pidfile
作为锁定和处理单像
kill 9
作为通信工具

您的文件可能是最简单的方法。该文件可能希望包含在那里找到该文件的客户端的连接信息,以了解如何联系创建该文件的实例。我注意到您的问题仍然“未解决”-因为您没有接受答案。请看一看,然后决定是否要回答。或者让我知道是否有什么我可以做的,以加强我的投入,使其值得接受。接受帮助未来的读者确定问题是否得到解决,并对花时间回答你的人表示感谢。谢谢很抱歉,我之前没有澄清,但这不是一个服务器程序,尽管你确实为我的另一个项目提出了一些有趣的想法。欢迎你。你知道,如果你不接受答案,你可以随时投票来表达你的感激之情:-)。。。放心吧:restful听起来需要做很多工作,但使用jersey和gson,你可以在几个小时内完成相当惊人的工作。