簡體   English   中英

不同Jar / Classloaders之間的通信

[英]Communication between different Jar's/Classloaders

我有以下問題需要解決:

有兩個jar文件。 這些罐子彼此獨立地開始。

現在,讓我們說第一個jar A.jar計算或計算一些東西,並且必須將結果提交給B.jar

我嘗試通過一個中心Singleton進行通信(enum Singleton和一個使用自己的類加載器的Singleton,如下所述:Singleton類有幾個不同的類加載器 )。

但它似乎對我不起作用。 當我啟動兩個jar時,實例的哈希碼是不同的。

誰能告訴我我做錯了什么? 或者其他想法如何解決我的問題?

有兩個jar文件。 這些罐子彼此獨立地開始。

所以他們是獨立的過程 它們不會共享類,變量等的實例。您需要某種形式的進程間通信來在它們之間進行通信。

這通常意味着某種形式的網絡協議(例如TCP / UDP套接字,HTTP等)。 你也可以做一些非常簡單的事情,比如讀/寫共享文件(這不是特別好,但對於簡單的情況來說很簡單)

如果您分別運行2個jar文件,那么每個jar文件都會運行自己的JVM實例,並且它們之間不會共享任何內容。 他們是2個單獨的過程。 句號。

如果您希望在它們之間進行通信,那么這里有其他選擇:它取決於您希望傳輸的數據類型。

如果它只是字符串,那么:如果number of process = 2 ,如果你確定它,那么stdin &8 stdout是最好的前進方式。 一個進程可以通過使用ProcessBuilder創建Process然后使用流進行通信來開始運行另一個Jar文件。 另一個進程可以只執行System.out來傳遞消息。 這比Socket更受歡迎,因為您不必處理套接字等的優雅關閉(如果它失敗並且端口沒有成功解鎖,則可能是一個很大的麻煩)

如果number of jar files > 2 (即總進程數)且less than 10 ,則可以使用套接字並通過Socket進行通信。 這應該很好,雖然額外的努力是優雅地管理套接字。

如果number of processLarge ,則應使用JMS 它做了很多你不需要處理的事情。 如果進程數量較少,則任務太大。

因此,在您的情況下,流程是最好的前進方式。 如果您要傳輸的數據,甚至可以是對象。 考慮到進程數量較少,可以使用RMI 如果更多,請再次使用JMS

編輯:現在對於以上所有,涉及很多骯臟的工作。 如果你正在尋找新的和令人興奮的東西,我會建議akka。 它是基於actor的模型,它使用Messages進行相互通信。 美女是,演員可以在同一個JVM或另一個(非常小的配置)和akka照顧其余的你。 我沒有看到比這更干凈的方式:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM