我有以下情况:
我有2个 JVM 进程(实际上是分别运行的2个 java进程,而不是2个线程)在本地机器上运行。我们称之为 ProcessA和 ProcessB。
java
ProcessA
ProcessB
我希望它们彼此通信(交换数据)(例如,ProcessA向 ProcessB发送消息以完成某事)。
现在,我通过编写一个临时文件来解决这个问题,这些进程定期扫描这个文件以获取消息。我认为这个解决方案不太好。
要达到我的目的,还有什么更好的选择呢?
插座可能是更好的选择,我认为。
你要找的是 inter-process communication。Java 以 Java RMI API的形式提供了一个简单的 IPC 框架。还有一些其他的行程间通讯机制,比如管道、套接字、消息队列(显然,这些都是概念,所以有一些框架实现了这些)。
inter-process communication
我认为在您的情况下,JavaRMI 或者一个简单的自定义套接字实现就足够了。
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年,我实现了一些代码,这些代码使用套接字完成工作。在此之前,我多次寻找更好的解决方案,因为套接字方法触发防火墙和我的客户端担心。直到现在才有更好的解决办法。客户端必须序列化您的数据,发送和服务器必须接收和取消序列化。 很简单。