Java JNLPAPI的SingleInstanceService是如何工作的?
正如前面提到的,SingleInstanceService允许在JavaWebStart下启动的应用程序将自己注册为Singleton,并在用户尝试启动新实例时将其传递到新的参数集中 它是如何工作的 我们向服务注册listners一次,它将不允许它创建另一个实例。但基本上它是如何工作的,我不知道Java JNLPAPI的SingleInstanceService是如何工作的?,java,java-web-start,jnlp,Java,Java Web Start,Jnlp,正如前面提到的,SingleInstanceService允许在JavaWebStart下启动的应用程序将自己注册为Singleton,并在用户尝试启动新实例时将其传递到新的参数集中 它是如何工作的 我们向服务注册listners一次,它将不允许它创建另一个实例。但基本上它是如何工作的,我不知道 SingleInstanceService sis; ... try { sis = (SingleInstanceService)ServiceManager.
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功能为您预先实现了它。您是在问如何使用它还是如何实现它?我不是在问如何使用它,而是问它是如何工作的?我已经提到了它是如何使用的,我也在我的应用程序中使用了它,但不知道它是如何停止注册另一个应用程序实例的。你是问如何使用它还是如何实现它吗?我不是问如何使用它,我是问它是如何工作的?我已经提到了它是如何使用的,我也在我的应用程序中使用了它,但没有了解它是如何停止注册另一个应用程序实例的