有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

消息队列纯java ZeroMQ客户端?

我试图使用ZeroMQ的发布订阅消息,但客户端要求代码都是Java。我知道ZeroMQ有一个Java绑定,但它仍然依赖于c库,因此我无法使用它。是否有一个ZeroMQ客户端可以用来连接到服务器,或者实现是否足够简单,我可以自己完成


共 (6) 个答案

  1. # 1 楼答案

    我正在研究纯java ZeroMQ

    https://github.com/miniway/jeromq

    即使是在非常早期的阶段,现在也可能不太适合生产使用

    但我希望这会有所帮助,因为我满怀激情地做了这件事

  2. # 2 楼答案

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

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

    它包括一个为android预先构建的zeromq tarball,使用NDK(原生开发工具包),将Java应用程序连接到标准c库

  3. # 3 楼答案

    目前还没有0mq的纯Java实现。正如您所说,有一个Java语言绑定,但它需要一个本机库来运行。用纯Java替换该库并不是一件容易实现的事情

  4. # 4 楼答案

    从今天起,我认为可以安全地假设你的问题的答案是否

    纯java客户端需要使用与本地C++实现相同的有线协议;记录这个协议还没有完成,在我上次检查时,它已经在0MQ开发者待办事项列表中

  5. # 5 楼答案

    ZeroMQ在http://rfc.zeromq.org/spec:13使用的wire协议有一个简短的规范。这样,您至少应该能够编写代码的协议部分。您仍然需要编写处理ZeroMQ套接字等的部分

  6. # 6 楼答案

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

    我举了一个例子,我正在使用谷歌协议缓冲区从ZeroMQ发布服务器向订阅者发送一些消息

    测试。原始文件是

    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。爪哇

    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);
        }
    }
    

    用户代码为 文件名:订户。爪哇

    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);
        }
    }
    

    就这些。。你的代码完成了。。 现在只需运行这些发布者和订阅者代码