【问题标题】:How to call Java program from NodeJs [duplicate]如何从NodeJs调用Java程序[重复]
【发布时间】:2013-09-15 18:10:14
【问题描述】:

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

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

如何做到这一点?用示例代码回答将是最有用的。

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

【问题讨论】:

  • 这不是重复的:stackoverflow.com/questions/8389974/… 吗?
  • 作为副本关闭的问题似乎不是一个很好的匹配;这有一个示例代码的答案,而另一个只是讨论了两种方法之间的权衡,而没有说明如何做。我正在投票重新开放。
  • 我也投票决定重新开放。如果有的话,目标应该作为这篇文章的副本关闭。

标签: java node.js


【解决方案1】:

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

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

【讨论】:

  • 非常有帮助,谢谢!我不确定使用 exec 或 spawn ,因为我认为 spawn 不会创建新进程,而是由运行 nodejs 代码的进程拥有的东西。但现在看起来 spawn 中的分离功能会解决这个问题
  • 有没有办法异步监听从 java 应用程序端写入标准输入的人?
  • @endy 你的意思是像this这样的吗?
  • 在我的用例中,我使用 Node.js 作为工具,它只需要调用一些 Java 实用程序并等待答案。在这种情况下,execFileSyncspawn 更合适(该方法也将标准输出作为必须转换为字符串的 Node.js 缓冲区返回)。
  • @TomášZáluský 我对这个方法很感兴趣,你有例子吗?谢谢
【解决方案2】:

您可以使用模块 node-java-caller 简单地调用带有类路径和参数的 java 命令

【讨论】:

    【解决方案3】:

    即使父进程退出,通常生成的子进程也不会结束。要杀死子进程,需要将子进程 pid 记录在某个地方(在文件中以允许该值即使在父进程退出时也存在),并且可以在需要时使用它来杀死子进程。

    【讨论】:

    • 这不适用于 node.js。您必须传递 `detached: true` 以便子进程不会与父进程一起退出。
    猜你喜欢
    • 2021-05-13
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 2018-04-22
    • 2013-09-28
    • 1970-01-01
    相关资源
    最近更新 更多