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