为了账号安全,请及时绑定邮箱和手机立即绑定

通知单独的 JVM 执行任务

通知单独的 JVM 执行任务

交互式爱情 2021-07-05 12:13:37
所以我正在制作一个一次只运行一个实例的程序但是现在我想这样做,如果用户尝试启动另一个实例,它将消耗该尝试并通知当前实例显示其gui。目前我正在考虑通过使用文件来做到这一点。在启动第二个实例时,show.stage将创建一个名为的文件。当另一个实例检测到该文件时,它将显示其 gui 并删除该文件。我知道这行得通,但我想知道是否有更优雅的方法来做到这一点。我能不能设置一个环境标志,另一个实例可以检查或通过套接字侦听器通知它,尽管其他人似乎不鼓励这样做。我觉得创建文件将是最简单、最可靠的方式,但我愿意接受任何建议该程序将在普通窗口上运行。
查看完整描述

3 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

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

  • 正如您已经想到的,文件系统可以用作两个 jvm 之间的通信通道。但这仅适用于在同一服务器上运行的 jvm。

  • 因此,已经建议的套接字解决方案使您能够(稍后)将相同的解决方案应用于分布式环境。缺点是您必须在非常低的级别上实现协议。

  • 过去,人们经常转向消息总线解决方案(例如 ActiveMQ)

  • 在 2018 年,另一种选择是实现一个简单的 Restful API,例如使用 jaxrs 和 jersey。

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


查看完整回答
反对 回复 2021-07-14
?
UYOU

TA贡献1878条经验 获得超4个赞

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

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

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


查看完整回答
反对 回复 2021-07-14
?
炎炎设计

TA贡献1808条经验 获得超4个赞

尝试使用pidfile锁和单进程kill 9作为通信工具


查看完整回答
反对 回复 2021-07-14
  • 3 回答
  • 0 关注
  • 133 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信