关于node.js:如何从NodeJs调用Java程序

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记录在某个位置(在文件中,以使该值即使在父进程退出时也存在),并且可以在需要时使用该进程杀死该子进程。