簡體   English   中英

同一JVM中的類之間的通信

[英]Inter-classloader communication in the same JVM

我有一個提供服務的JVM庫(稱為“ tool ”)。 對於某些特定功能,該tool必須調用第三方代碼。 通過將用戶定義的Jar文件加載到自定義類加載器中,並調用接受String列表作為參數的用戶定義函數來完成此操作。 本質上,這是一個基本的插件基礎結構。

對於我的用例,我想使兩個插件在這些約束條件下互相交談。 插件可以執行他們想要的任何操作(包括生成長期存在的后台線程),但是只能通過tool調用它們。

對我不起作用的最簡單的解決方案是將兩個插件“合並”在一起。 (假設上面的場景是給定的。我已經大大簡化了事情。)

我當前的解決方案是將兩個插件都更改為打開TCP套接字,並使tool在初始化時傳遞端口號。 但是,這感覺像是一個可怕的駭客,因為它們已經在同一進程中運行,並且網絡不必要地使事情變得復雜。

我的問題是:JVM是否有任何輕松的類加載器間通信庫? 它只需要支持傳遞字符串和本機類型(數組,...),但是至關重要的是,它必須僅使用字符串進行初始化。 然后,我有可能將其打包為tool並讓其他插件通過它進行通信。 假設我可以將任意依賴項添加到插件,但不能添加到tool

基本思想是使“通信層”成為框架的一部分(即在基本類加載器中)。

如果您有相當特定的需求,則制作相對特定的api可能很容易。 一個插件注冊為提供者,其他插件可以為使用者。

如果您的需求超出了范圍,那么您可能想要實現(或找到)某種“消息總線”類型的基礎架構。 它提供了一種輕量級的機制來動態傳遞“消息”。 每個插件都可以使用特定的名稱作為消息目標,然后其他插件可以向它們發送消息(並可能接收答復)。

每個jdk中內置的另一種可能性是JMX(一種經常被忽視但功能強大的技術)。 您可以使用核心類型提供強類型的api,並且在jvm上運行的任何代碼都可以與這些api進行交互(雙重好處是您也可以在jvm 之外與它們進行交互)。

暫無
暫無

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

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