是否可以使用 Process Builder 在 Java 中的进程之间共享变量

Is it possible to share variable between processes in Java with Process Builder

原始消息

我目前正在处理几个由调度程序调用的另一个 Java 进程(或“启动器”)调用的可执行 Jar。

为此,我们使用 ProcessBuilder。但是,我们需要能够在父进程和子进程之间共享变量(可执行 JAR)。

我知道可以使用 environment() 方法将变量传递给子进程。

我们需要的是能够将信息从子进程共享到父进程(进程结果,主要是文件)。可能吗?如果是,怎么会这样?

更新 这两个 java 进程在同一台计算机上,因此共享同一个磁盘 space。 Launcher 进程由调度程序调用,此进程无法更改。

我知道使用文件可能是最好的解决方案,但我想知道是否没有其他解决方案。

在此先感谢您的帮助。

进程是一种黑盒子,您只能通过标准流(输入、输出、错误)与之对话或检索进程的退出代码。 所有其他系统都需要一种外部方式进行通信。

所以你可以:

  • 使用Process的方法exitValue()作为child和parent之间的一种交流形式。

  • 使用getInputStream()方法拦截child进程的输出。

  • 与外部资源(例如文件、数据库或打开的通信套接字)共享数据。

您需要进程之间的双向通信。您可以从三个备选方案中进行选择:

  1. 异步低级:每次通信使用一个pre-stablished磁盘文件:一个文件将各个子进程的数据写入父进程,另一个文件从父进程写入数据到子进程(如果需要)。

  2. 同步通用server/client级别:在每个必须接收数据的进程(父进程或每个子进程)上,打开一个ServerSocket并根据你自己的协议(通常这必须在辅助线程上完成)。

  3. 特定于同步的 Java RMI 级别:这是您可以获得的最先进、最灵活和最可用的替代方案:设计和实现 RMI 接口并将其作为服务器部署在每个进程上必须接收数据,并将其部署为必须发送数据的每个进程的客户端。

您需要做的不是直接执行您的流程,而是创建一个(批处理)脚本来执行命令,然后将变量的值写入文件。然后让 ProcessBuilder 执行(批处理)脚本。 然后,在调用另一个进程之前,读取文件,并使用您提到的 environment() 方法将变量值传递给 ProcessBuilder。

因此(批处理)脚本如下所示:

<your command>
echo $variable > file.txt

然后以脚本文件名作为参数执行shell:

bash batchscript.sh

在windows中,它的工作原理是一样的,除了你要执行

cmd /c batchscript.cmd

有一个名为 Terracotta 的产品允许在多个 JVM 实例之间共享对象。 onwer 公司还有 open source versions 的产品,但我已经不认识了。

如果你想按照 Little Santi 的建议使用 RMI,你可以使用 Spring-remoting 使它更容易。