纯Java ZeroMQ客户端?

时间:2010-08-15 06:13:19

标签: java message-queue zeromq

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

7 个答案:

答案 0 :(得分:12)

我正在研究纯Java ZeroMQ。

https://github.com/miniway/jeromq

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

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

答案 1 :(得分:6)

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

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

包括为Android预先构建的zeromq的tarball,使用NDK(Native Development Kit)将Java应用程序连接到标准c库。

答案 2 :(得分:4)

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

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

答案 3 :(得分:2)

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

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

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

ZeroMQ在http://rfc.zeromq.org/spec:13使用的有线协议有一个简短的规范。有了它,你至少应该能够编写代码的协议部分。您仍然需要编写处理ZeroMQ套接字的部件以及诸如此类的东西。

答案 6 :(得分:0)

2011年8月开始的javazmq项目声称在纯Java中实现了ZeroMQ的子集。此时不确定它的完整性。