【问题标题】:Is it possible to share variable between processes in Java with Process Builder是否可以使用 Process Builder 在 Java 中的进程之间共享变量
【发布时间】:2016-01-04 16:38:02
【问题描述】:

原始信息

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

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

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

我们需要的是能够将信息从子进程共享到父进程(进程结果,主要是文件)。是否可以?如果是,那又如何?

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

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

提前感谢您的帮助。

【问题讨论】:

    标签: java environment processbuilder


    【解决方案1】:

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

    所以你可以:

    • 使用Process的方法exitValue()作为孩子和父母之间的一种交流方式。

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

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

    【讨论】:

    • 我已经在使用 waitFor 来获取返回码,但这不是我需要从子进程中获取的。根据您的回答,考虑到父环境是为子进程复制的,我想不可能共享一些环境变量?
    • 不在进程之间。只能在线程之间直接共享数据(通过共享变量)
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 嗨。感谢您的回答。您的解决方案非常适合允许多个进程在每个进程之间进行通信。但是,考虑到我总是只有两个进程,设置第二个和第三个解决方案对我来说可能有点矫枉过正。然而,考虑到我的情况,低级解决方案可能是最好的解决方案。
    • @qbisson 我明白了。第一种选择的主要缺点是异步性:也许你可以使用这个问题的一些答案:stackoverflow.com/q/494869/4040817
    【解决方案3】:

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

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

    <your command>
    echo $variable > file.txt
    

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

    bash batchscript.sh
    

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

    cmd /c batchscript.cmd
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-19
        • 1970-01-01
        • 1970-01-01
        • 2012-04-09
        • 2011-06-25
        • 2016-12-14
        • 2019-12-24
        相关资源
        最近更新 更多