原始消息
我目前正在研究由调度程序调用的另一个Java进程(或“Launcher”)调用的几个可执行Jars。
为此,我们使用ProcessBuilder。但是,我们需要能够在父进程和子进程(可执行JAR)之间共享变量。
我知道可以使用environment()方法将变量传递给子进程。
我们需要的是能够将子进程的信息共享到父进程(进程结果,主要是文件)。可能吗?如果是的话,怎么样?
更新 这两个java进程位于同一台计算机上,因此共享相同的磁盘空间。 Launcher进程由调度程序调用,并且无法更改此进程。
我知道使用文件可能是最好的解决方案,但我想知道是否没有其他解决方案。
提前感谢您的帮助。
答案 0 :(得分:2)
进程是一种黑盒子,您只能通过标准流(输入,输出,错误)或检索进程的退出代码进行对话。 所有其他系统都需要外部通信方式。
所以你可以:
使用Process
的{{1}}方法作为儿童与父母之间的沟通方式。
使用getInputStream()
方法拦截子进程的输出。
与外部资源(例如文件,数据库或打开通信套接字)共享数据。
答案 1 :(得分:2)
您需要流程之间的双向通信。您可以从三种选择中进行选择:
异步低级别:为每个通信使用预先建立的磁盘文件:一个文件用于将数据从每个子进程写入父进程,另一个用于将数据从父进程写入子进程(如果需要)。
同步通用服务器/客户端级别:在每个必须接收数据的进程(父进程或每个子进程)上,打开ServerSocket
并根据您自己的协议接受请求(通常为必须在辅助线程上完成。
同步特定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来简化它。