纯java ZeroMQ客户端?

纯java ZeroMQ客户端?,java,message-queue,zeromq,Java,Message Queue,Zeromq,我试图使用ZeroMQ的发布子消息传递,但客户端要求代码全部为Java。我知道ZeroMQ有一个Java绑定,但它仍然依赖于c库,因此我无法使用它。是否有ZeroMQ客户端可用于连接服务器,或者实现是否足够简单,我可以自己完成?目前没有0mq的纯Java实现。正如您所说,有一个Java语言绑定,但它需要一个本机库来运行。对于库的纯Java替换实现起来并不简单。到今天为止,我认为可以安全地假设您的问题的答案是否 纯java客户端需要使用与本地C++实现相同的有线协议;记录此协议尚未完成,在我上次检

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

目前没有
0mq
的纯Java实现。正如您所说,有一个Java语言绑定,但它需要一个本机库来运行。对于库的纯Java替换实现起来并不简单。

到今天为止,我认为可以安全地假设您的问题的答案是


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

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


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

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

2011年8月启动的项目声称要在纯Java中实现ZeroMQ的一个子集。目前还不确定它是否完整

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

我有一个例子,我正在使用google协议缓冲区从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);
    }
}
就这些..您的代码已经完成。。
现在只需运行这些发布者和订阅者代码。

我正在使用纯java ZeroMQ

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


但我希望它能有所帮助,因为我满怀激情地制作了它。

您使用过RabbitMQ吗?它有纯Java客户端。我从未尝试过ZeroMQ,但我认为您将有一个相当不错的类与ZeroMQ相对应:您使用ZeroMQ有任何原因吗?我从未听说过,这并不意味着它是坏的。有太多其他选项更为人所知,可以满足您的需求。我需要一个快速、轻量级的消息传递,我认为ZeroMQ非常适合。不过,如果必要的话,我可能会尝试其他方法。我有同样的问题。ZeroMQ看起来正是我在服务器端想要的,但我想在客户端使用Android。这些欲望让我和法纳问了同样的问题。有什么理由不选择其中一个答案吗?(我没有写明确的“否”,因为可能有人通过查看wire协议编写了一个纯Java的库,但如果是这种情况,它还没有公布)快速更正:它需要一个非官方的NDK,而不是来自Google的NDK。这个库现在也托管在ZeroMQ的github配置文件中。ZeroMQ wiki建议该库不要使用NDK解决方案。Min:我只是想感谢您将其移植到纯java。我已经在prod中使用jeromq版本0.2.0(很快将升级到0.3.1)大约5个月了。酒吧/酒吧、经销商/路由器和定制的majordomo模式,就像一种魅力!如果我有一个旧的zeroMQ PUSH,jeromq PULL客户端是否能够接收到它(给定套接字号等)?