我有以下情况:
我有 2 个 JVM 进程(实际上是 2 个java
单独运行的进程,而不是 2 个线程)在本地机器上运行。我们称它们ProcessA
为ProcessB
.
我希望他们相互交流(交换数据)(例如ProcessA
发送消息ProcessB
做某事)。
现在,我通过编写一个临时文件来解决这个问题,这些过程会定期扫描这个文件以获取消息。我认为这个解决方案不是很好。
什么是实现我想要的更好的选择?
我有以下情况:
我有 2 个 JVM 进程(实际上是 2 个java
单独运行的进程,而不是 2 个线程)在本地机器上运行。我们称它们ProcessA
为ProcessB
.
我希望他们相互交流(交换数据)(例如ProcessA
发送消息ProcessB
做某事)。
现在,我通过编写一个临时文件来解决这个问题,这些过程会定期扫描这个文件以获取消息。我认为这个解决方案不是很好。
什么是实现我想要的更好的选择?
IPC的多种选择:
如果没有更多细节,基于裸机网络的 IPC 方法似乎是最好的,因为它是:
话虽如此,根据您的示例(只需请求其他进程执行操作),JMX 对您来说也可能足够好。
我在 github 上添加了一个名为 Mappedbus ( http://github.com/caplogic/mappedbus ) 的库,它允许两个(或更多)Java 进程/JVM 通过交换消息进行通信。该库使用内存映射文件,并利用 fetch-and-add 和 volatile 读/写来同步不同的读取器和写入器。我使用这个库测量了两个进程之间的吞吐量,达到 4000 万条消息/秒,读取/写入一条消息的平均延迟为 25 纳秒。
您正在寻找的是inter-process communication
. Java 以Java RMI API的形式提供了一个简单的 IPC 框架。还有其他几种用于进程间通信的机制,例如管道、套接字、消息队列(显然,这些都是概念,因此存在实现这些的框架)。
我认为在您的情况下,Java RMI 或简单的自定义套接字实现就足够了。
带有 DataInput(Output)Stream 的套接字,用于来回发送 java 对象。这比使用磁盘文件容易,比 Netty 容易得多。
我倾向于使用 jGroup 在进程之间形成本地集群。它适用于同一台机器、同一 JVM 甚至不同服务器上的节点(也称为进程)。
一旦您了解了基础知识,就可以轻松使用它,并且可以选择在同一 JVM 中实际运行两个或多个进程,从而轻松轻松地测试这些进程。
如果两者都在同一台机器上,开销和延迟是最小的(通常每个动作只有大约 >100ns 的 TCP 往返)。
我认为套接字可能是一个更好的选择。
早在 2004 年,我就实现了使用套接字完成工作的代码。在那之前,我多次寻找更好的解决方案,因为套接字方法会触发防火墙,我的客户很担心。直到现在还没有更好的解决方案。客户端必须序列化您的数据,发送和服务器必须接收和反序列化。这很容易。