我有以下问题要解决:
有两个jar
文件。这些罐子彼此独立启动。
现在,假设第一个 jarA.jar
计算或计算某些东西,并且必须将结果提交到B.jar
.
我尝试通过中央单例进行通信(枚举单例和使用自己的类加载器的单例,如此处所述:Singleton class with several different classloaders)。
但这似乎对我不起作用。当我启动这两个 jar 时,实例的哈希码是不同的。
谁能告诉我我做错了什么?或其他想法如何解决我的问题?
我有以下问题要解决:
有两个jar
文件。这些罐子彼此独立启动。
现在,假设第一个 jarA.jar
计算或计算某些东西,并且必须将结果提交到B.jar
.
我尝试通过中央单例进行通信(枚举单例和使用自己的类加载器的单例,如此处所述:Singleton class with several different classloaders)。
但这似乎对我不起作用。当我启动这两个 jar 时,实例的哈希码是不同的。
谁能告诉我我做错了什么?或其他想法如何解决我的问题?
有两个jar文件。这些罐子彼此独立启动。
所以它们是独立的进程。它们不会共享类、变量等的实例。您需要某种形式的进程间通信来在它们之间进行通信。
这通常意味着某种形式的网络协议(例如 TCP/UDP 套接字、HTTP 等)。你也可以做一些非常简单的事情,比如读/写共享文件(这不是特别好,但对于简单的情况来说很简单)
如果您分别运行 2 个 jar 文件,则每个 jar 文件都运行自己的 JVM 实例,它们之间不会共享任何内容。它们是 2 个单独的过程。句号。
如果您希望在它们之间进行通信,那么这里有一些替代方案:这取决于您希望传输的数据类型。
如果它只是字符串,那么:如果number of process = 2
你确定它,那么stdin
&8stdout
是最好的前进方式。Jar
一个进程可以通过创建一个Process
usingProcessBuilder
然后使用流进行通信来开始运行另一个文件。其他进程可以只是System.out
传输消息。这比 Socket 更受欢迎,因为您不必处理套接字的优雅关闭等。(如果它失败并且端口没有成功取消绑定,这可能是个大麻烦)
如果number of jar files > 2
(即总进程数)并less than
说10
,您可能可以使用套接字并通过套接字进行通信。这应该可以很好地工作,尽管在优雅地管理套接字方面需要付出额外的努力。
如果number of process
是Large
,那么JMS
应该使用。它做了很多你不需要处理的事情。如果进程数较少,则任务太大。
所以在你的情况下,过程是最好的前进方式。如果您要传输的数据,甚至可以是对象。RMI
可以在进程数较少的情况下使用。如果更多,请JMS
再次使用。
编辑:现在对于以上所有内容,都涉及很多肮脏的工作。作为改变,如果你正在寻找新的和令人兴奋的东西,我会建议 akka。它是一个基于actor的模型,使用消息相互通信。美妙之处在于,演员可以在同一个 JVM 或另一个(非常少的配置)上,而 akka 会为您处理其余的事情。我还没有看到比这样做更清洁的方法:)