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

时间:2016-01-04 16:38:02

标签: java environment processbuilder

原始消息

我目前正在研究由调度程序调用的另一个Java进程(或“Launcher”)调用的几个可执行Jars。

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

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

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

更新 这两个java进程位于同一台计算机上,因此共享相同的磁盘空间。 Launcher进程由调度程序调用,并且无法更改此进程。

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

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

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

所以你可以:

  • 使用Process的{​​{1}}方法作为儿童与父母之间的沟通方式。

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

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

答案 1 :(得分:2)

您需要流程之间的双向通信。您可以从三种选择中进行选择:

  1. 异步低级别:为每个通信使用预先建立的磁盘文件:一个文件用于将数据从每个子进程写入父进程,另一个用于将数据从父进程写入子进程(如果需要)。

  2. 同步通用服务器/客户端级别:在每个必须接收数据的进程(父进程或每个子进程)上,打开ServerSocket并根据您自己的协议接受请求(通常为必须在辅助线程上完成。

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

答案 2 :(得分:0)

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

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

<your command>
echo $variable > file.txt

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

bash batchscript.sh

在Windows中,除了你想要执行

之外,它的工作方式相同
cmd /c batchscript.cmd

答案 3 :(得分:0)

有一种名为Terracotta的产品允许跨多个JVM实例共享对象。 onwer公司仍有open source versions他们的产品,但我不再了解它们。

如果你想按照Little Santi的建议使用RMI,你可以使用Spring-remoting来简化它。