簡體   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