How to call Java program from NodeJs
本问题已经有最佳答案,请猛点这里访问。
我有一个Java程序,通常从命令行启动。从命令行启动后,Java程序将一直运行直到按下Ctrl C退出该程序或杀死另一个脚本中的命令。 Java程序将错误消息(如果有的话)输出到控制台。
现在,我想开发基于Express的NodeJs Web应用程序。当用户单击链接(运行)时,单击处理程序将调用Ajax请求,这将导致后端NodeJs脚本运行该Java程序(如果尚未运行)。另一个链接(停止)将使Ajax请求停止该Java程序。
这如何实现?用示例代码回答将是最有用的。
还有一个要求:如果此NodeJs Web应用程序终止,则由它启动的Java程序将继续运行,即它不依赖于NodeJs Web应用程序。
您可以启动子进程,并在不需要时发送终止信号。
1 2 | var spawn = require('child_process').spawn; var child = spawn('java', ['params1', 'param2']); |
要终止该应用程序或模拟CTRL C,请发送信号:
1 2 3 4 5 | // control + c is an interrupt signal child.kill('SIGINT'); // or send from the main process process.kill(child.pid, 'SIGINT'); |
如果要分离运行应用程序,则可能应该将PID写入某处。要运行分离的应用程序,请按以下方式运行它:
1 2 3 4 5 6 7 8 9 | var fs = require('fs'); var out = fs.openSync('./out.log', 'a'); var err = fs.openSync('./out.log', 'a'); var child = spawn('java', [], { detached: true, stdio: [ 'ignore', out, err ] }); child.unref(); |
这会产生一个子进程,其I / O流与父进程无关。
您可以简单地使用classpath调用java命令
即使父进程退出,通常产生的子进程也不会结束。要终止子进程,需要将子进程pid记录在某个位置(在文件中,以使该值即使在父进程退出时也存在),并且可以在需要时使用该进程杀死该子进程。