如何让2个JVM相互交谈

我有以下情况:

我有2个JVM进程(真正的2个java进程是分开运行的,而不是2个线程)在本地机器上运行。 我们称之为ProcessAProcessB

我希望他们相互交stream(交换数据)(例如ProcessA发送消息给ProcessB做某事)。

现在,我通过编写一个临时文件来解决这个问题,并且这些进程会定期扫描这个文件来获取消息。 我认为这个解决scheme不太好。

什么是更好的select来实现我想要的?

IPC的多种select:

基于套接字(裸骨)networking

  • 不一定很难 ,但是:
    • 可能是冗长的,
    • 可能为bug提供更多的表面,因为你编写更多的代码。
  • 你可以依靠现有的框架,比如Netty

RMI

  • 从技术上讲,这也是networking通信,但这对你来说是透明的。

全面的消息传递架构

  • 通常build立在RMI或networking通信上,但支持复杂的对话和工作stream程
  • 对于简单的东西来说可能太重了
  • 像ActiveMQ或JBoss Messaging这样的框架

Javapipe理扩展(JMX)

  • 更多意味着JVMpipe理和监视 ,但是如果你主要想让一个进程查询另一个数据,或者发送一些动作请求(如果它们不是太复杂),可以帮助实现你想要的东西
  • 也适用于RMI(其他可能的协议)
  • 一开始并不是那么简单,但实际上使用起来相当简单

文件共享/文件locking

  • 这就是你现在正在做的
  • 这是可行的,但有很多问题需要处理

信号

  • 你可以简单地发送信号到你的其他项目
  • 然而,这是相当有限的,并要求你实现一个翻译层(虽然这可行的,但玩具比任何严重的疯狂的想法。

没有更多的细节,基于networking的裸机IPC方法似乎是最好的,因为它是:

  • 最具扩展性的(就添加新function和工作stream程而言)
  • 最轻量级(就应用程序的内存占用而言)
  • 最简单的(就devise而言)
  • 最有教育意义的(就学习如何实施IPC而言)。 (正如你在评论中提到“套接字很难”,而且它确实不是,应该是你的工作)

这就是说,根据你的例子(简单地请求其他进程做一个动作),JMX对你来说也可以是足够好的。

我在github上添加了一个名为Mappedbus( http://github.com/caplogic/mappedbus )的库,它使两个(或更多)Java进程/ JVM通过交换消息进行通信。 该库使用内存映射文件,并使用读取和添加以及易失性读取/写入来同步不同的读取器和写入器。 我已经测量了使用这个库的两个进程之间的吞吐量,达到4千万个消息/秒,平均延迟为25纳秒,用于读取/写入单个消息。

你正在寻找的是inter-process communication 。 Java以Java RMI API的forms提供了一个简单的IPC框架。 还有其他一些进程间通信的机制,如pipe道,套接字,消息队列(这些都是概念,显然,所以有框架来实现这些)。

我认为在你的情况下,Java RMI或一个简单的自定义套接字实现就足够了。

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

我倾向于使用jGroup在进程之间形成本地集群。 它适用于同一台计算机上的节点(也称为进程),同一个JVM内甚至跨不同的服务器。

一旦理解了基础知识,就可以轻松使用它,并且可以select在同一个JVM中真正运行两个或多个进程,从而轻松地testing这些进程。

如果两者都在同一台机器上(通常每个动作通常只有大于100ns的TCP rountrip),则开销和延迟是最小的。

sockets可能是一个更好的select,我想。