[英]Is it possible to share variable between processes in Java with Process Builder
原始信息
我目前正在研究由调度程序调用的另一个Java进程(或“ Launcher”)调用的几个可执行Jar。
为此,我们使用ProcessBuilder 。 但是,我们需要能够在父进程和子进程(可执行JAR)之间共享变量。
我知道可以使用environment()方法将变量传递给子进程。
我们需要的是能够从子流程到父流程(流程结果,主要是文件)共享信息。 可能吗? 如果是,怎么办?
更新两个Java进程位于同一台计算机上,因此共享相同的磁盘空间。 调度程序将调用Launcher进程,并且无法更改此进程。
我知道使用文件可能是最好的解决方案,但是我想知道是否没有其他解决方案。
在此先感谢您的帮助。
流程是一种黑匣子,您只能通过标准流(输入,输出,错误)或获取流程的退出代码进行对话。 所有其他系统都需要外部通信方式。
所以你可以:
使用Process
的方法exitValue()
作为子代与父代之间的一种通信形式。
使用getInputStream()
方法拦截子进程的输出。
与外部资源(例如文件,数据库或打开通讯套接字)共享数据。
您需要流程之间的双向通信 。 您可以从以下三种选择中进行选择:
异步低级:每次通信使用预先设置的磁盘文件:一个文件将数据从每个子进程写入父进程,另一个文件将数据从父进程写入子进程(如果需要)。
同步通用服务器/客户端级别:在必须接收数据的每个进程(父进程或每个子进程)上,打开ServerSocket
并根据您自己的协议接受请求(通常必须在辅助线程上完成)。
特定于同步的Java RMI级别:这是您可以获得的最先进,灵活和可用的替代方案:设计和实现RMI接口,并将其作为服务器在必须接收数据的每个进程中进行部署,并作为客户端在每个需要接收数据的进程中进行部署必须发送数据。
您需要执行的操作不是直接执行流程,而是创建一个(批处理)脚本来执行命令,然后将变量的值写入文件。 然后使ProcessBuilder执行(批处理)脚本。 然后,在调用另一个进程之前,请阅读文件,然后使用您提到的environment()
方法将变量值传递给ProcessBuilder。
因此,(批处理)脚本如下所示:
<your command>
echo $variable > file.txt
然后以脚本文件名作为参数执行shell:
bash batchscript.sh
在Windows中,它的工作原理相同,只是要执行
cmd /c batchscript.cmd
有一种名为Terracotta的产品,允许在多个JVM实例之间共享对象。 上级公司仍具有其产品的开源版本 ,但我不再了解它们。
如果要按照Little Santi的建议使用RMI,则可以使用Spring-remoting使其更容易。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.