我正在尝试使用 ZeroMQ 的 pub sub 消息传递,但客户端要求代码全部为 Java。我知道 ZeroMQ 有一个 Java 绑定,但它仍然依赖于 ac 库,因此我无法使用它。是否有我可以用来连接到服务器的 ZeroMQ 客户端,或者实现是否足够简单让我自己做?
7 回答
zeromq 网站在以下页面上声称支持 android:
http://www.zeromq.org/distro:android
其中包括为 android 预构建的 zeromq 压缩包,使用 NDK(本机开发工具包)将 Java 应用程序连接到标准 c 库。
截至今天,我认为可以安全地假设您的问题的答案是否定的。
纯 Java 客户端需要使用与本地 C++ 实现相同的有线协议;记录这个协议还没有完成,上次我检查时它在 0MQ 开发人员 TODO 列表中。
注意:我假设你已经成功安装了 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);
}
}
仅此而已..您的代码已完成..现在只需运行这些发布者和订阅者代码..
2011 年 8 月开始的javazmq项目声称用纯 Java 实现 ZeroMQ 的一个子集。在这一点上不确定它的完整性。
在http://rfc.zeromq.org/spec:13上有一个关于 ZeroMQ 使用的有线协议的简短规范。有了它,您至少应该能够编写代码的协议部分。您仍然需要编写处理 ZeroMQ 套接字之类的部分。
目前没有纯 Java 实现0mq
。正如您所说,有一个 Java 语言绑定,但它需要一个本机库才能运行。实现该库的纯 Java 替代品并非易事。