我有以下情况:
我在本地计算机上运行了2个JVM进程(实际上是2个java
进程,而不是2个线程)。我们称他们为ProcessA
和ProcessB
。
我希望他们彼此沟通(交换数据)(例如ProcessA
向ProcessB
发送消息以执行某些操作)。
现在,我通过编写临时文件解决此问题,这些进程会定期扫描此文件以获取消息。我认为这个解决方案不太好。
什么是实现我想要的更好的选择?
答案 0 :(得分:78)
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年,我就实现了使用套接字完成这项工作的代码。在此之前,我多次寻求更好的解决方案,因为套接字方法会触发防火墙,而我的客户会担心。到目前为止,没有更好的解决方案。客户端必须序列化您的数据,发送,服务器必须接收并反序列化。 很简单。