Java JNLPAPI的SingleInstanceService是如何工作的?

Java JNLPAPI的SingleInstanceService是如何工作的?,java,java-web-start,jnlp,Java,Java Web Start,Jnlp,正如前面提到的,SingleInstanceService允许在JavaWebStart下启动的应用程序将自己注册为Singleton,并在用户尝试启动新实例时将其传递到新的参数集中 它是如何工作的 我们向服务注册listners一次,它将不允许它创建另一个实例。但基本上它是如何工作的,我不知道 SingleInstanceService sis; ... try { sis = (SingleInstanceService)ServiceManager.

正如前面提到的,SingleInstanceService允许在JavaWebStart下启动的应用程序将自己注册为Singleton,并在用户尝试启动新实例时将其传递到新的参数集中

它是如何工作的

我们向服务注册listners一次,它将不允许它创建另一个实例。但基本上它是如何工作的,我不知道

SingleInstanceService sis; 
    ... 

    try { 
        sis = (SingleInstanceService)ServiceManager.lookup("javax.jnlp.SingleInstanceService");
    } catch (UnavailableServiceException e) { sis=null; }

    ...


    // Register the single instance listener at the start of your application

    SISListener sisL = new SISListener();
    sis.addSingleInstanceListener(sisL);

    ...


    // Remember to remove the listener before your application exits

    sis.removeSingleInstanceListener(sisL);
    System.exit(0);


    // Implement the SingleInstanceListener for your application

    class SISListener implements SingleInstanceListener {
        public void newActivation(String[] params) {

            // your code to handle the new arguments here

            ...
        }
    }

我想知道的是,一旦我们将应用程序与SingleInstanceListener绑定,它将如何不允许另一个实例?

这是一个老问题,但没有答案

我发现这篇文章对我很有帮助

基本上,您正在运行的java进程将调用
newActivation()
方法,您可以做任何您想做的事情,打开另一个窗口,显示错误对话框,等等。请注意,如果您调用
System.exit()
,它将结束您的单例运行进程。我建议注册一个关机钩子来移除

 Runnable r = new Runnable()
 {

            public void run()
            {
                SingleInstanceService       isis  = null;
                try { 
                    isis = (SingleInstanceService) ServiceManager.lookup("javax.jnlp.SingleInstanceService");
                    isis.removeSingleInstanceListener(this);
                }
                catch(Throwable t)
                {
                    //...
                }
            }
 }; 
        Runtime.getRuntime().addShutdownHook(new Thread(r, "shutdown singleton instance"));

这是旧的,但没有答案

我发现这篇文章对我很有帮助

基本上,您正在运行的java进程将调用
newActivation()
方法,您可以做任何您想做的事情,打开另一个窗口,显示错误对话框,等等。请注意,如果您调用
System.exit()
,它将结束您的单例运行进程。我建议注册一个关机钩子来移除

 Runnable r = new Runnable()
 {

            public void run()
            {
                SingleInstanceService       isis  = null;
                try { 
                    isis = (SingleInstanceService) ServiceManager.lookup("javax.jnlp.SingleInstanceService");
                    isis.removeSingleInstanceListener(this);
                }
                catch(Throwable t)
                {
                    //...
                }
            }
 }; 
        Runtime.getRuntime().addShutdownHook(new Thread(r, "shutdown singleton instance"));

如果您对日志稍加注意,就会发现该机制的提示。 如果启动应用程序(在激活单实例侦听器时),您将看到一个日志,其中显示它在半随机端口打开了一个服务器套接字

当启动第二个实例时,在执行任何操作之前,它会尝试连接到同一端口(这次作为客户端)。如果连接成功,那么它知道另一个实例已经在运行,因此它只是将参数传递给前者(可能是通过同一个连接,对此不确定)

如果它无法连接,它知道它是第一个实例(或前一个实例已关闭),并正常启动应用程序


这是一个众所周知的强制应用程序的单个实例的技巧。当然,您可以自己实现它,只是SingleInstance功能为您预先实现了它。

如果您注意一下日志,您将发现该机制的提示。 如果启动应用程序(在激活单实例侦听器时),您将看到一个日志,其中显示它在半随机端口打开了一个服务器套接字

当启动第二个实例时,在执行任何操作之前,它会尝试连接到同一端口(这次作为客户端)。如果连接成功,那么它知道另一个实例已经在运行,因此它只是将参数传递给前者(可能是通过同一个连接,对此不确定)

如果它无法连接,它知道它是第一个实例(或前一个实例已关闭),并正常启动应用程序


这是一个众所周知的强制应用程序的单个实例的技巧。您当然可以自己实现它,只是SingleInstance功能为您预先实现了它。

您是在问如何使用它还是如何实现它?我不是在问如何使用它,而是问它是如何工作的?我已经提到了它是如何使用的,我也在我的应用程序中使用了它,但不知道它是如何停止注册另一个应用程序实例的。你是问如何使用它还是如何实现它吗?我不是问如何使用它,我是问它是如何工作的?我已经提到了它是如何使用的,我也在我的应用程序中使用了它,但没有了解它是如何停止注册另一个应用程序实例的