不同Jar / Classloaders之间的通信

时间:2013-08-07 15:57:11

标签: java singleton classloader

我有以下问题需要解决:

有两个jar个文件。这些罐子彼此独立地开始。

现在,假设第一个jar A.jar计算或计算某些内容,并且必须将结果提交到B.jar

我试图通过一个中心的Singleton进行通信(enum Singleton和一个使用自己的类加载器的Singleton,如上所述here: Singleton class with several different classloaders)。

但它似乎对我不起作用。当我启动两个jar时,实例的哈希码是不同的。

谁能告诉我我做错了什么?或者其他想法如何解决我的问题?

2 个答案:

答案 0 :(得分:4)

如果您分别运行2个jar文件,那么每个jar文件都会运行自己的JVM实例,并且它们之间不会共享任何内容。他们是2个单独的过程。全停止。

如果您希望在他们之间进行交流,那么这里有替代方案: 这取决于您希望传输的数据类型。

如果只是字符串,那么: 如果number of process = 2如果您确定,那么stdin& 8 stdout是最好的前进方式。一个进程可以通过使用Jar创建Process然后使用流进行通信来开始运行另一个ProcessBuilder文件。另一个进程可以System.out来传递消息。这比Socket更受欢迎,因为你不必处理套接字等的优雅关闭(如果它失败并且端口没有成功解锁,则可能是一个很大的麻烦)

如果number of jar files > 2(即总进程数)和less than10,则可以使用套接字并通过Socket进行通信。这应该很好,尽管额外的工作是优雅地管理套接字。

如果number of processLarge,则应使用JMS。它做了很多你不需要处理的事情。如果进程数量较少,则任务太大。

因此,在您的情况下,流程是最好的前进方式。 如果您要传输的数据,甚至可以是对象。可以使用RMI,因为进程数较少。如果更多,请再次使用JMS

编辑:现在对于上述所有内容,涉及到很多肮脏的工作。如果您正在寻找新的东西,那么令人兴奋,我会建议akka。它是基于actor的模型,它使用Messages进行相互通信。美女是,演员可以在同一个JVM或另一个(非常小的配置)和akka照顾其余的你。我没有看到比这样做更清洁的方式:)

答案 1 :(得分:3)

  

有两个jar文件。这些罐子独立于每个瓶子   其他

所以他们是单独的进程。他们不会共享类,变量等实例。您需要某种形式的进程间通信来进行通信。

这通常意味着某种形式的网络协议(例如TCP / UDP套接字,HTTP等)。你也可以做一些非常简单的事情,比如读/写共享文件(这不是特别好,但对于简单的情况来说很简单)