我有两个 Java 程序,每个程序都在自己的 JVM 实例中运行?他们可以使用任何 IPC 技术(如共享内存或管道)相互通信吗?有没有办法做到这一点?
5 回答
是的; D-BUS和Pipes都易于使用且跨平台。D-BUS 对于一般的消息传递 IPC 和发送批量数据的管道很有用。
如果您需要支持连接到中央服务器的多个客户端,您还可以在 localhost 上打开 TCP 或 UDP 套接字。
我还在Java 中找到了 UNIX 套接字的实现,尽管它需要 JNI。
http://java.sun.com/javase/technologies/core/basic/rmi/index.jsp
Java 远程方法调用 (Java RMI) 使程序员能够创建基于 Java 技术到基于 Java 技术的分布式应用程序,其中远程 Java 对象的方法可以从可能在不同主机上的其他 Java 虚拟机*调用。RMI 使用对象序列化来编组和解组参数并且不截断类型,支持真正的面向对象的多态性。
当然。看看 RMI 或Java Spaces 之类的共享内存概念。
在 Java NIO 中使用 MemoryMappedByteBuffer 在进程之间共享内存。
对于来自 Apache 的列式(即基于数组的)数据的与语言无关的 IPC,有一个相当新的倡议,称为Plasma。
到目前为止(2017 年 9 月)还没有 JVM 绑定,但是由于该项目得到了 Spark 之类的支持,我认为我们很快就会看到实现。
然而,我的理解是,没有一个通用的 IPC 系统,因为它旨在共享用于科学计算的原语数组double
,long
而不是类/对象;虽然我在这里可能是错的。从好的方面来说,它也与语言无关,因此您可以使用它与另一个(非 JVM)运行时进行通信。但是,OP 确实要求使用 Java IPC,因此这可能无关紧要。