繁体   English   中英

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

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

原始信息

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

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

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

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

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

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

在此先感谢您的帮助。

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

所以你可以:

  • 使用Process的方法exitValue()作为子代与父代之间的一种通信形式。

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

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

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

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

  2. 同步通用服务器/客户端级别:在必须接收数据的每个进程(父进程或每个子进程)上,打开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实例之间共享对象。 上级公司仍具有其产品的开源版本 ,但我不再了解它们。

如果要按照Little Santi的建议使用RMI,则可以使用Spring-remoting使其更容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM