同一JVM中的类间加载器通信

时间:2016-02-07 18:59:24

标签: java jvm classloader

我有一个提供服务的JVM库(称之为" tool")。对于某些特定功能,tool必须调用第三方代码。它通过将用户定义的Jar文件加载到自定义类加载器并调用接受String s列表作为参数的用户定义函数来实现。从本质上讲,它是一个基本的插件基础设施。

对于我的用例,我想在这些约束中让两个插件相互通信。插件可以做任何他们想做的事情(包括产生长寿命的后台线程),但它们只能被tool调用。

对我来说不起作用的最简单的解决方案是"合并"两个插件在一起。 (假设上面的场景是给定的。我已经大大简化了一些事情。)

我目前的解决方案是将两个插件更改为打开TCP套接字,并在初始化时使tool传递端口号。然而,这感觉就像一个可怕的黑客,因为他们已经在相同的过程中运行,网络将不必要地使问题复杂化。

我的问题是:JVM是否有任何无痛的跨类加载器通信库?它只需要支持传递字符串和本机类型(数组,...),但至关重要的是,它必须只使用字符串进行初始化。然后,我可以将其打包为tool并让其他插件通过它进行通信。假设我可以向插件添加任意依赖项,但不能添加tool

1 个答案:

答案 0 :(得分:1)

基本思想是使“通信层”成为框架的一部分(即在基类加载器中)。

如果你有一个相当具体的需求,那么制作一个相对特定的api可能相当容易。一个插件注册为提供者,其他插件可以是消费者。

如果您的需求比这更广泛,那么您可能希望实现(或找到)某种“消息总线”类型的基础结构。提供动态传递“消息”的轻量级机制的东西。每个插件都可以使用特定的名称作为消息目的地,然后其他插件可以向它们发送消息(并且可能接收回复)。

另一种可能性是内置于每个jdk中的是JMX(一种经常被忽视但功能强大的技术)。你可以使用核心类型提供强类型api,并且jvm上运行的任何代码都可以与那些apis交互(双重奖励是你可以与它们交互 jvm之外)。