【问题标题】:Can ZeroMQ be used by two JVM processes to communicate on same machine?两个 JVM 进程可以使用 ZeroMQ 在同一台机器上进行通信吗?
【发布时间】: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。这里的结论跳跃符合奥林匹克标准。

标签: java tcp jvm ipc zeromq


【解决方案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 都可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 2016-10-06
      相关资源
      最近更新 更多