当用户注销时 Java 服务停止工作

当用户注销时 Java 服务停止工作

背景信息:

我有四个应用程序作为服务运行在一组 Windows XP 机器上,其中两个是 Java 应用程序。这四个应用程序最初设计为从 Linux 服务器运行,并有三台 Windows XP 机器连接到它,但客户要求将这些应用程序移植到 Windows,以便所有应用程序都可以从一台机器运行。

问题:

由于我们不想为了将应用程序作为服务运行而大幅更改代码中的任何内容,因此我们使用instsrv.exesrvany.exe来安装和运行应用程序。这对于两个 c++ 应用程序来说运行良好,并且在大多数情况下,java 应用程序运行良好。但是,当用户注销时,java 应用程序会停止。实际服务仍在运行,因为java.exe(或javaw.exe,无论哪个)仍在运行,但它不再运行应用程序。就服务管理器而言,一切都运行良好,因此它不会像应该的那样重新启动服务。请注意,主用户使用的是受限帐户,因此无法手动重新启动服务。

我们已经考虑/尝试过的东西:

srvany.exe.之所以选择它,主要是因为它免费(就像 beer 一样)并且配置起来相对容易。我们也考虑过srvstart.exe,但我认为它存在同样的问题。我们研究过两个专用的 Java 服务包装器,但由于许可条款和/或配置困难而被排除在考虑范围之外。请注意亚美尼亚联合社会主义者最初并未被考虑,但时间允许的话,可能会进行测试。

该问题似乎不存在 Windows 7 上,但由于我们的客户需要 Windows XP,所以这不是一个选择。

我也尝试过允许两个 Java 应用程序进行桌面交互,但这并不能解决使用时的问题javaw.exe,并且在使用时会显示命令行窗口java.exe,这是非常不理想的,即使它确实解决了问题。到目前为止,我们的权宜之计是告诉客户不要注销帐户,而只使用切换用户。

还有什么我遗漏了或者应该尝试的吗?这也是时间敏感的,因为一旦这些设备出门,现场修复可能非常困难。

答案1

您需要添加—Xrs标记到 java.exe 命令行,以防止 JVM 在您注销 XP 计算机时退出。此问题不会出现在 Windows 7(或 Vista/Server 2008)上,因为“会话 0 隔离”会阻止用户登录(并因此注销)运行服务的位置会话 0。

但请注意——如果您的 Java 应用程序捕获了关闭事件,则当您使用 -Xrs 标志时,这些事件可能不会按预期触发。这对您来说是个问题吗?

相关内容