我正在尝试使用ZeroMQ的pub子消息,但客户端要求代码都是Java。我知道ZeroMQ有一个Java绑定但仍依赖于c库,因此我无法使用它。是否有可以用来连接服务器的ZeroMQ客户端,或者我自己做的实现是否足够简单?
答案 0 :(得分:12)
答案 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的子集。此时不确定它的完整性。