如何让2个JVM相互通信

时间:2012-06-08 02:39:02

标签: java ipc concurrent-programming

我有以下情况:

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

我希望他们彼此沟通(交换数据)(例如ProcessAProcessB发送消息以执行某些操作)。

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

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

7 个答案:

答案 0 :(得分:78)

IPC的多个选项:

基于套接字(裸骨)网络

  • not necessarily hard,但是:
    • 可能并不多,
    • 当您编写更多代码时,
    • 可能会为bug提供更多表面。
  • 您可以依赖现有的框架,例如Netty

RMI

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

完全成熟的消息传递架构

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

Java Management Extensions (JMX)

  • 更多适用于JVM management and monitoring,但如果您最想让一个进程查询另一个进程查询数据,或者发送一些操作请求(如果它们不是太复杂),则可以帮助实现您想要的内容< / LI>
  • 也适用于RMI(以及其他可能的协议)
  • 起初并不是那么简单,但是actually rather simple to use

文件共享/文件锁定

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

信号

  • 您只需向其他项目发送信号
  • 即可
  • 然而,它相当有限,需要你实现一个翻译层( 可行但是,但这是一个相当疯狂的想法,而不是任何严肃的玩具。

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

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

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

答案 1 :(得分:17)

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

答案 2 :(得分:6)

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

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

答案 3 :(得分:3)

使用DataInput(输出)Stream的套接字,来回发送java对象。这比使用磁盘文件更容易,并且比Netty更容易。

答案 4 :(得分:2)

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

一旦理解了基础知识,就可以轻松使用它,并且可以选择在同一个JVM中实际运行两个或多个进程,从而可以轻松地轻松测试这些进程。

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

答案 5 :(得分:0)

我认为,

套接字可能是更好的选择。

答案 6 :(得分:0)

早在2004年,我就实现了使用套接字完成这项工作的代码。在此之前,我多次寻求更好的解决方案,因为套接字方法会触发防火墙,而我的客户会担心。到目前为止,没有更好的解决方案。客户端必须序列化您的数据,发送,服务器必须接收并反序列化。 很简单。