两个 JVM 进程可以使用 ZeroMQ 在同一台机器上进行通信吗?
Posted
技术标签:
【中文标题】两个 JVM 进程可以使用 ZeroMQ 在同一台机器上进行通信吗?【英文标题】:Can ZeroMQ be used by two JVM processes to communicate on same machine? 【发布时间】:2014-03-06 01:38:19 【问题描述】:我一直使用 ActiveMQ 或 RabbitMQ,但最近开始深入研究 ZeroMQ,因为它得到了关注。如果我阅读的内容是正确的,那么它似乎是消息代理以及进程间通信(IPC)的机制?
我的情况是,我有 2 个 Java 进程需要在同一台机器上相互通信。我不想使用共享文件方法,因为它们之间的对话/协议非常复杂,而且文件解决方案看起来很笨拙。
所以我打算开始使用 Netty 或 MINA 之类的东西来定义我自己的通信协议,并让它们通过端口进行对话,但后来我开始阅读有关 ZeroMQ 的内容想知道我是否可以用更少的工作完成同样的工作。
所以我问:ZeroMQ 是否可以用于 Java 进程之间的 IPC,如果可以,是否有具体的代码示例或文章解释了如何做到这一点?
【问题讨论】:
Zero
表示零经纪人。 ZeroMQ 用于基于消息的 IPC,他们的网站上有大量示例。
感谢@Peter Lawrey (+1) - 但如果你真的访问他们的网站,你会发现:(1) 大量非 Java 语言的示例,以及 (2) Java例如,所有这些都关注多个线程之间的通信在同一个 JVM 进程中,而不是在 2 个 JVM 进程之间......
我在您的陈述中看不到任何与 @PeterLawrey 告诉您的单词相矛盾的内容。
沉默是让人头疼的问题,一开始怎么会有人怀疑这一点。
这里没有证据表明任何人不了解进程和线程之间的区别,也没有证据表明 ZeroMQ 仅限于单个 JVM。这里的结论跳跃符合奥林匹克标准。
【参考方案1】:
web site 的前三行告诉你所有你需要知道的事情。
分布式计算变得简单
Ø 充当并发框架的套接字库。 Ø 跨inproc、IPC、TCP和多播传送消息。
我看不出有任何理由怀疑这在环回中不起作用,如果它不能,那将是非常奇怪的。
【讨论】:
【参考方案2】:是的,zmq 可以用来连接两个 Java 进程。您可以将纯 Java 实现 JeroMq 或 ZeroMq 与 Java 客户端一起使用。 JeroMq 更容易安装,因为您只需要适当的依赖项。以下是监听器的简单示例:
import org.zeromq.ZMQ;
public class Subscriber
public static void main(String[] a)
final ZMQ.Context ctx = ZMQ.context(1);
final ZMQ.Socket sub = ctx.socket(ZMQ.SUB);
// sub.connect("tcp://localhost:6001");
sub.connect("ipc://001");
sub.subscribe("".getBytes());
while (true)
String msg = sub.recvStr();
System.out.println(msg);
对于出版商:
import org.zeromq.ZMQ;
public class Publisher
public static void main(String[] a) throws InterruptedException
final ZMQ.Context ctx = ZMQ.context(1);
final ZMQ.Socket pub = ctx.socket(ZMQ.PUB);
pub.bind("ipc://001");
// pub.bind("tcp://*:6001");
while (true)
System.out.println("Publishing");
pub.send("Test");
Thread.sleep(1000);
IPC 和 TCP 都可以工作。
【讨论】:
以上是关于两个 JVM 进程可以使用 ZeroMQ 在同一台机器上进行通信吗?的主要内容,如果未能解决你的问题,请参考以下文章
在 .NET 中,同一台机器上的两个进程进行通信的最佳方式是啥?