2

我有以下问题要解决:

有两个jar文件。这些罐子彼此独立启动。

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

我尝试通过中央单例进行通信(枚举单例和使用自己的类加载器的单例,如此处所述:Singleton class with several different classloaders)。

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

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

4

2 回答 2

4

有两个jar文件。这些罐子彼此独立启动。

所以它们是独立的进程。它们不会共享类、变量等的实例。您需要某种形式的进程间通信来在它们之间进行通信。

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

于 2013-08-07T16:01:15.923 回答
4

如果您分别运行 2 个 jar 文件,则每个 jar 文件都运行自己的 JVM 实例,它们之间不会共享任何内容。它们是 2 个单独的过程。句号。

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

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

如果number of jar files > 2(即总进程数)并less than10,您可能可以使用套接字并通过套接字进行通信。这应该可以很好地工作,尽管在优雅地管理套接字方面需要付出额外的努力。

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

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

编辑:现在对于以上所有内容,都涉及很多肮脏的工作。作为改变,如果你正在寻找新的和令人兴奋的东西,我会建议 akka。它是一个基于actor的模型,使用消息相互通信。美妙之处在于,演员可以在同一个 JVM 或另一个(非常少的配置)上,而 akka 会为您处理其余的事情。我还没有看到比这样做更清洁的方法:)

于 2013-08-07T16:17:04.620 回答