如何从NodeJs调用Java程序

时间:2013-09-15 18:10:14

标签: java node.js

我有一个Java程序,我通常从命令行开始。从命令行启动后,java程序将一直运行,直到按下Ctrl + C退出它或从另一个脚本中删除命令。 Java程序向控制台输出错误消息(如果有的话)。

现在我想开发基于Express的NodeJs Web应用程序。当用户单击链接(运行)时,单击处理程序将调用Ajax请求,这将导致后端NodeJs脚本运行此Java程序(如果尚未运行)。另一个链接(Stop)将使Ajax请求停止此Java程序。

如何实现这一目标?使用示例代码回答最有用。

还有一个要求:如果此NodeJs Web应用程序终止,由它启动的Java程序将继续运行,即它不依赖于NodeJs Web应用程序。

3 个答案:

答案 0 :(得分:11)

您可以启动子进程,并在不需要时发送终止信号。

var spawn = require('child_process').spawn;
var child = spawn('java', ['params1', 'param2']);

要终止应用程序,或模拟 CTRL + C ,请发送信号:

// control + c is an interrupt signal
child.kill('SIGINT');

// or send from the main process
process.kill(child.pid, 'SIGINT');

如果您要运行分离的应用程序,您应该在某处编写PID。要运行分离的应用程序,请按以下方式运行它:

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流与父进程无关。

答案 1 :(得分:1)

您可以使用模块node-java-caller

来简单地调用带有类路径和参数的java命令。

答案 2 :(得分:0)

即使父进程退出,通常产生的子进程也不会结束。要终止子进程,需要将子进程pid记录在某个位置(在文件中,以使该值即使在父进程退出时也存在),并且可以在需要时使用该进程杀死该子进程。