如何让2个JVM相互通信

tnk*_*eka 63 java ipc concurrent-programming

我有以下情况:

java在本地计算机上运行了2个JVM进程(实际上有2个进程单独运行,而不是2个线程).我们称他们ProcessAProcessB.

我希望他们彼此沟通(交换数据)(例如ProcessA发送消息来ProcessB做某事).

现在,我通过编写临时文件解决此问题,这些进程会定期扫描此文件以获取消息.我认为这个解决方案并不是那么好.

什么是实现我想要的更好的选择?

hay*_*lem 83

IPC的多种选择:

基于套接字(裸骨)网络

  • 不一定很难,但是:
    • 可能是冗长的,
    • 当您编写更多代码时,可能会为错误提供更多表面.
  • 你可以依赖现有的框架,比如Netty

RMI

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

完全成熟的消息传递架构

  • 通常也建立在RMI或网络通信上,但支持复杂的对话和工作流程
  • 可能对于简单的事情来说太重了
  • ActiveMQJBoss Messaging这样的框架

Java管理扩展(JMX)

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

文件共享/文件锁定

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

信号

  • 您只需将信号发送到您的其他项目即可
  • 但是,它相当有限,需要你实现一个翻译层(虽然这可行的,但玩具比任何严肃的东西都是一个相当疯狂的想法.

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

  • 最具扩展性(在为您的网站添加新功能和工作流程方面)
  • 最轻量级(就应用程序的内存占用而言)
  • 最简单的(在设计方面)
  • 最具教育性(在学习如何实施IPC方面).(正如你在评论中提到"套接字很难",它确实不是,应该是你工作的东西)

话虽如此,根据您的示例(只是请求其他进程执行操作),JMX对您来说也足够好了.


Mik*_*elJ 19

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

  • 如果我没有弄错,这个lib将一些固定大小的文件映射到内存中,并附加消息直到文件结束,这是否意味着当从文件中读取所有内容时它会死掉?据我所知,它不是环形缓冲区 (5认同)

Str*_*lok 6

你在寻找什么inter-process communication.Java以Java RMI API的形式提供了一个简单的IPC框架.进程间通信还有其他几种机制,例如管道,套接字,消息队列(显然,这些都是概念,因此存在实现这些的框架).

我认为在您的情况下,Java RMI或简单的自定义套接字实现应该足够了.