如何让两个 JVM 相互交流

我有以下情况:

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

我希望它们彼此通信(交换数据)(例如,ProcessAProcessB发送消息以完成某事)。

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

要达到我的目的,还有什么更好的选择呢?

52821 次浏览

插座可能是更好的选择,我认为。

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

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

IPC的多种选择:

基于套接字(Bare-Bones)的网络

RMI

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

成熟的消息传递体系结构

  • 通常也建立在 RMI 或网络通信之上,但是支持复杂的对话和工作流
  • 对于一些简单的东西来说可能太沉重了
  • ActiveMQ或者 JBoss 消息这样的框架

JMX (JMX)

  • 更多的意思是为 JVM 管理和监视,但可以帮助实现你想要什么,如果你主要想有一个进程查询另一个数据,或发送一些请求的行动,如果他们不是太复杂
  • 也可以在 RMI 上工作(在其他可能的协议中)
  • 一开始并不容易理解,但是 其实用起来很简单

文件共享/文件锁定

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

信号

  • 您可以简单地向其他项目发送信号
  • 然而,它相当有限,并且需要您实现一个翻译层(尽管它是 可行的,但是这是一个非常疯狂的想法,而不是任何严肃的东西。

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

  • 最具可扩展性(在向您的
  • 最轻量级(就应用程序的内存占用而言)
  • 最简单的(就设计而言)
  • 最有教育意义(在学习如何实现 IPC 方面)

也就是说,基于您的示例(只是请求其他进程执行一个操作) ,JMX 对您来说也足够好了。

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

我倾向于使用 jGroup 在进程之间形成本地集群。它适用于同一台机器上的节点(又名进程)、同一个 JVM 内部甚至不同服务器之间的节点。

一旦理解了这些基础知识,就很容易使用它,并且拥有在同一 JVM 中实际运行两个或多个进程的选项使得测试这些进程变得很容易。

如果两者都在同一台计算机上,那么开销和延迟都是最小的(通常每个操作的 TCP 往返大约大于100ns)。

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

回到2004年,我实现了一些代码,这些代码使用套接字完成工作。在此之前,我多次寻找更好的解决方案,因为套接字方法触发防火墙和我的客户端担心。直到现在才有更好的解决办法。客户端必须序列化您的数据,发送和服务器必须接收和取消序列化。 很简单。