[英]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.