如何有2个JVM上相互交谈如何有2个JVM上相互交谈(How to have 2 JVMs talk

2019-05-17 11:29发布

我有以下情况:

我有2个JVM进程(真2 java程序运行分开,而不是2个线程)在本地机器上运行。 让我们把他们ProcessAProcessB

我希望他们能互相通信(交换数据)(例如ProcessA发送消息给ProcessB做一些事情)。

现在,我解决这个问题写一个临时文件,这些过程是周期性扫描该文件,以获得消息。 我认为这个解决方案是不那么好。

这将是一个更好的选择,以实现我想要什么?

Answer 1:

对于多个选项IPC :

插座为基础的(裸机)网络

  • 不一定辛苦 ,但是:
    • 也许不了多少是冗长的,
    • 当你写更多的代码可能为错误提供更多的表面。
  • 你可以依靠现有框架,如Netty的

RMI

  • 从技术上讲,这也是网络通讯,但这是透明的为您服务。

完全成熟的消息传递架构

  • 通常建立在无论是RMI或网络通信为好,但对于复杂的对话和工作流程支持
  • 可能是太重量级简单的东西
  • 像框架的ActiveMQ或JBoss的消息

Java管理扩展(JMX)

  • 更意味着JVM的管理和监控 ,但可以帮助实现你想要什么,如果你主要是想有一个过程的查询另一个用于数据,或发送一些请求的动作,如果他们不是太复杂
  • 也工作了RMI(除其他可能的协议)
  • 没那么简单,首先绕到你的头,但其实相当简单易用

文件共享/文件锁定

  • 这就是你现在在做什么
  • 它是可行的,但附带了很多的问题处理

信号

  • 你可以简单地将信号发送到其他项目
  • 然而,这是相当有限的,需要您实现一个转换层(它可行的,虽然,但一个相当疯狂的想法玩弄比什么都严重。

如果没有更多的细节,一个基于网络的裸骨IPC方法似乎是最好的,因为它是:

  • 最具扩展性(在增加新的功能和工作流程方面的
  • 最轻量级(在您的应用程序的内存占用方面)
  • 最简单(在设计方面)
  • 最具教育(学习如何实现IPC而言)。 (如你所提到的“插座硬”的评论,真的不是,应该是你在工作的东西)

话虽这么说,可根据您的例子(简单地询问对方的过程做一个动作),JMX也可能是对你不够好。



Answer 2:

我已经添加在GitHub上一库调用Mappedbus( http://github.com/caplogic/mappedbus ),它使两个(或更多)的Java进程/ JVM上通过交换消息进行通信。 库使用内存映射文件和利用的读取和添加和挥发性读/写同步不同的读者和作家。 我已经使用这个库40万消息/ s的25纳秒的平均延迟用于读/写的单个消息测量的两个过程之间的吞吐量。



Answer 3:

你要找的是inter-process communication 。 Java提供的形式简单的IPC框架的Java RMI API 。 有如管道,套接字,消息队列(这些是所有的概念,显然,所以有实现这些框架)几个其他机制的进程间通信。

我觉得你的情况的Java RMI或一个简单的自定义套接字实现应该足够了。



Answer 4:

与DataInput中的(输出)流,套接字到Java对象来回发送。 这比使用磁盘文件更容易,而且比Netty中容易得多。



Answer 5:

我倾向于使用jGroup形成过程之间的本地集群。 它适用于节点(又名处理)在同一台机器上,在同一JVM中,甚至在不同的服务器上。

一旦你了解的基础知识很容易与它的工作,并具有选项居然在同一个JVM上运行两个或多个进程可以轻松方便地测试这些进程。

开销和等待时间是最小的,如果两者都在同一台机器上(约>为100ns的每次操作通常只有一个TCP rountrip)。



Answer 6:

插座可能是一个更好的选择,我想。



文章来源: How to have 2 JVMs talk to one another