12

我正在尝试使用 ZeroMQ 的 pub sub 消息传递,但客户端要求代码全部为 Java。我知道 ZeroMQ 有一个 Java 绑定,但它仍然依赖于 ac 库,因此我无法使用它。是否有我可以用来连接到服务器的 ZeroMQ 客户端,或者实现是否足够简单让我自己做?

4

7 回答 7

13

我正在研究纯 java ZeroMQ。

https://github.com/miniway/jeromq

即使它还处于早期阶段,现在可能不太适合生产使用。

但我希望它会有所帮助,因为我充满热情。

于 2012-09-03T09:10:22.767 回答
6

zeromq 网站在以下页面上声称支持 android:

http://www.zeromq.org/distro:android

其中包括为 android 预构建的 zeromq 压缩包,使用 NDK(本机开发工具包)将 Java 应用程序连接到标准 c 库。

于 2011-02-19T05:20:41.577 回答
4

截至今天,我认为可以安全地假设您的问题的答案是否定的。

纯 Java 客户端需要使用与本地 C++ 实现相同的有线协议;记录这个协议还没有完成,上次我检查时它在 0MQ 开发人员 TODO 列表中。

于 2010-12-07T20:57:15.773 回答
3

注意:我假设你已经成功安装了 ZeroMQ 和 google protoc

我有一个例子,我使用谷歌协议缓冲区将一些消息从 ZeroMQ 发布者发送到订阅者..

test.proto 文件是

option java_package = "com.example.tutorial"; 
option java_outer_classname = "TestProtos";

message Test {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;
}

现在首先使用 protoc 编译器将其编译为

$protoc -I=. --java_out=. test.proto

所以这将TestProtos.java在您当前的目录 /com/example/tutorial文件夹中生成文件

----------------------协议缓冲区步骤结束------------ --------------

发布者代码是 文件名:Publisher.java

import org.zeromq.ZMQ;
import com.example.tutorial.TestProtos.Test;

public class Publisher {
    public static void main (String[] args) {
        ZMQ.Context context = ZMQ.context(1);
        ZMQ.Socket publisher = context.socket(ZMQ.PUB);

        // Subscriber tells us when it's ready here
        ZMQ.Socket sync = context.socket(ZMQ.PULL);

        sync.bind("tcp://*:5561");

        // We send updates via this socket
        publisher.bind("tcp://*:5562");

        System.out.println("Publisher Running");

        // Wait for synchronization request
        sync.recv(0);

        Test testzmq =
              Test.newBuilder()
                .setId(1234)
                .setName("Pritam Kharat")
                .setEmail("pritam@gmail.com")
                .build();

        long start = System.currentTimeMillis ();
        int request_nbr;
        for (request_nbr = 0; request_nbr != 10; request_nbr++) {
            //System.out.println(request_nbr);
            publisher.send(testzmq.toByteArray(), 0); //serialization
        }
        long end = System.currentTimeMillis ();
        long diff = (end - start);
        System.out.println("time taken to send messages "+ request_nbr +" is :" +diff);
    }
}

订阅者代码是 文件名:Subscriber.java

import org.zeromq.ZMQ;
import com.example.tutorial.TestProtos.Test;


public class Subscriber {
    public static void main (String[] args) {
        ZMQ.Context context = ZMQ.context(1);

        // Connect our subscriber socket
        ZMQ.Socket subscriber = context.socket(ZMQ.SUB);
        subscriber.setIdentity("hello".getBytes());

        // Synchronize with the publisher
        ZMQ.Socket sync = context.socket(ZMQ.PUSH);

        subscriber.subscribe("".getBytes());
        subscriber.connect("tcp://localhost:5562");
        sync.connect("tcp://localhost:5561");

        sync.send("".getBytes(), 0);

        long start = System.currentTimeMillis ();
        int request_nbr;
        for (request_nbr = 0; request_nbr != 10; request_nbr++) {
            byte[] rawBytes = subscriber.recv(0);
            try{
                Test data = Test.parseFrom(rawBytes); //deserialization
             //   System.out.println(data);
            }
            catch ( Exception e ) {
            }
        }
        long end = System.currentTimeMillis ();
        long diff = (end - start);
        System.out.println("time taken to receive messages "+ request_nbr +" is :" +diff);
    }
}

仅此而已..您的代码已完成..现在只需运行这些发布者和订阅者代码..

于 2012-08-24T12:33:05.733 回答
0

2011 年 8 月开始的javazmq项目声称用纯 Java 实现 ZeroMQ 的一个子集。在这一点上不确定它的完整性。

于 2012-06-26T12:04:52.750 回答
0

http://rfc.zeromq.org/spec:13上有一个关于 ZeroMQ 使用的有线协议的简短规范。有了它,您至少应该能够编写代码的协议部分。您仍然需要编写处理 ZeroMQ 套接字之类的部分。

于 2012-01-08T19:58:43.303 回答
0

目前没有纯 Java 实现0mq。正如您所说,有一个 Java 语言绑定,但它需要一个本机库才能运行。实现该库的纯 Java 替代品并非易事。

于 2010-10-26T14:12:29.077 回答