gpt4 book ai didi

Java 如何保存进程引用以便我可以运行 process.destroy()

转载 作者:行者123 更新时间:2023-12-01 04:28:23 24 4
gpt4 key购买 nike

我想通过我创建的可执行 jar 来启动 Web 服务(这样我最终可以使用 procrun 将其作为 Windows 服务启动)。目前,Web 服务是通过命令行调用类上的 main 方法来启动的。

这是迄今为止我的代码:

public class test 
{
private static boolean stop = false;
private static Process process;

public static void start(String[] args)
{
String classpath = "my\\classpath\\test.jar";

ProcessBuilder processBuilder = new ProcessBuilder("C:\\java\\jdk1.6.0_43\\bin\\java",
"-cp", classpath,
"com.test.theJavaWebServiceWithAMainMethod");
try
{
process = processBuilder.start();
}
catch (IOException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}

public static void stop(String[] args)
{
stop = true;

process.destroy();
}

public static void main(String[] args)
{
if (args != null && args.length > 0)
{
String command = args[0];

if ("start".equals(command))
{
start(args);
}
else if ("stop".equals(command))
{
stop(args);
}
}
else
{
throw new IllegalArgumentException("command missing");
}
}

}

启动工作正常。我在任务管理器中看到进程启动,现在可以提取 WSDL。然而,当我通过 process.destroy() 终止进程时(通过使用 argumentmnt stop 调用 main 方法),我得到了一个空指针异常,我假设是因为这个是 jvm 的一个新实例,因此它不知道我调用 start 时的进程。持久化此进程对象或 pid 或其他内容的最佳方法是什么,以便当我调用 stop 时,我可以找到并终止正在运行的 webservice(java 进程)?

最佳答案

您正在执行“测试”程序两次,这会产生两个完全独立的程序实例,并且它们彼此没有引用。因此,当您使用 stop 命令调用“test”程序时,process 变量为 null,因为当前程序中未创建该变量。

选项:

  • 重写主要方法以阻止,等待“停止”命令。这意味着启动/停止不是单独的异步程序执行。您将启动该程序,然后它会等待您输入停止命令,然后再退出。

  • 您可以设计一种方法来向其他应用程序“远程”发送信号...即使它们都在同一台计算机上运行。通过简单的网络套接字很容易做到这一点,并且是一种非常常见的方法。 (查看 Tomcat 的启动/停止命令处理作为示例......尽管它比您需要的更复杂。)总而言之......一旦运行,主程序就会监听服务器套接字。随后的“停止程序”作为客户端连接到该服务器套接字,以通知主程序它应该停止。

  • 您可以使用底层操作系统工具来查找并停止该程序。请参阅这个答案:How to find and kill running Win-Processes from within Java? 。但很难做到跨平台和通用。

目前还不清楚您想要做什么以及为什么要通过 ProcessBuilder 将 Web 服务作为单独的程序执行。根据您的要求,也许您可​​以这样做:

public void start(String[] args) 
{
try
{
com.test.theJavaWebServiceWithAMainMethod.main(args);
}
catch (IOException e1)
{
e1.printStackTrace();
}
}

当然,这会启动你的服务,然后你可以 control-c 来结束程序。

关于Java 如何保存进程引用以便我可以运行 process.destroy(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18238971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com