77

我有以下情况:

我有 2 个 JVM 进程(实际上是 2 个java单独运行的进程,而不是 2 个线程)在本地机器上运行。我们称它们ProcessAProcessB.

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

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

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

4

7 回答 7

89

IPC的多种选择:

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

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

RMI

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

成熟的消息传递架构

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

Java 管理扩展 (JMX)

  • 更多用于JVM 管理和监控,但如果您最希望让一个进程查询另一个进程以获取数据,或者向其发送一些操作请求(如果它们不太复杂),则可以帮助实现您想要的
  • 也适用于 RMI(在其他可能的协议中)
  • 一开始并不那么简单,但实际上使用起来相当简单

文件共享/文件锁定

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

信号

  • 您可以简单地将信号发送到您的其他项目
  • 然而,它相当有限,需要你实现一个翻译层(虽然它可行的,但一个相当疯狂的想法是玩弄而不是任何严肃的事情。

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

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

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

于 2012-06-08T02:52:32.910 回答
23

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

于 2015-05-17T20:59:16.947 回答
7

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

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

于 2012-06-08T02:45:49.620 回答
3

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

于 2012-06-08T05:02:07.527 回答
2

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

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

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

于 2015-04-30T09:30:39.333 回答
1

我认为套接字可能是一个更好的选择。

于 2012-06-08T02:42:11.407 回答
0

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

于 2019-08-18T12:28:30.047 回答