实现单实例Java应用程序

时间:2012-03-02 12:59:40

标签: java windows ipc

我不确定这是Windows还是Java问题。

我有一个在Windows下运行的Java应用程序。我已将特定文件扩展名(例如.xyz)与我的应用程序相关联,因此当我双击.xyz文件时,我的Java应用程序启动,而main()方法将.xyz文件视为其第一个参数。 / p>

但是当我单击另一个.xyz文件时,会启动一个新的Java应用程序实例。我更希望现有的应用程序处理新文件。

是否有标准方法可以执行此操作,还是需要从头开始编程?

如果是后者,我认为我必须做这样的事情:当启动应用程序的第二个实例时,它会检查另一个实例是否已经在运行(如何?),打开一个通信链接实例,并传递文件的名称。正确?

5 个答案:

答案 0 :(得分:2)

这是伪Java代码。

try {
    // start as non daemon service.
    new FileNameListener(new ServerSocket(KNOWN_PORT)).start();

} catch (BindException alreadyRunning) {
    // don't start a new service
}
// send to service, which could be the one just started.
sendFileName(new Socket("localhost", KNOWN_PORT), filename);

// finish the current thread, i.e. exit if no service is running.

答案 1 :(得分:2)

这是一种方法:

main()触发时,它会首先打开一个特定端口并侦听其他(后续)打开文件操作。

如果端口已经打开,则表示正在运行另一个实例,因此打开已经运行的实例的侦听端口的套接字并提供足够的信息以完成处理然后退出。

答案 2 :(得分:2)

另外,请阅读您问题的完全相同的答案:

答案 3 :(得分:1)

请参阅JWS solution。那使用SingleInstanceService。 JWS还可以声明对文件类型的兴趣。有关详细信息,请参阅file service demo.

它适用于Windows,* nix& OS X(并提供了许多其他不错的部署功能)。

答案 4 :(得分:0)

您可以使用JUnique库。它为运行单实例java应用程序提供支持,并且是开源的。

http://www.sauronsoftware.it/projects/junique/

另见How to implement a single instance Java application?

的完整答案