ZeroMQのpubsubメッセージングを使用しようとしていますが、クライアント側ではコードがすべてJavaである必要があります。ZeroMQにはJavaバインディングがあることを理解していますが、それでもacライブラリに依存しているため、使用できません。サーバーへの接続に使用できるZeroMQクライアントはありますか、それとも実装は自分で行うのに十分簡単ですか?
7 に答える
私は純粋なJavaZeroMQに取り組んでいます。
https://github.com/miniway/jeromq
それでも非常に初期の段階であり、現時点では本番環境での使用には適していない可能性があります。
しかし、私は情熱を持ってそれを作ったので、それが役立つことを願っています。
zeromq Webサイトは、次のページでAndroidのサポートを主張しています。
http://www.zeromq.org/distro:android
これには、Javaアプリを標準cライブラリにブリッジするNDK(Native Development Kit)を使用して、Android用に事前に構築されたzeromqのtarballが含まれています。
今日の時点で、あなたの質問に対する答えはノーであると考えるのが安全だと思います。
純粋なJavaクライアントは、ネイティブC++実装と同じワイヤープロトコルを使用する必要があります。このプロトコルの文書化はまだ行われておらず、前回チェックしたときに0MQ開発者のTODOリストに含まれていました。
注:ZeroMQとgoogleprotocが正常にインストールされていることを前提としています
Googleプロトコルバッファを使用してZeroMQパブリッシャーからサブスクライバーにメッセージを送信している例が1つあります。
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);
}
}
これですべてです。コードはこれで完了です。これらのパブリッシャーコードとサブスクライバーコードを実行するだけです。
ZeroMQで使用されるワイヤープロトコルに関する短い仕様がhttp://rfc.zeromq.org/spec:13にあります。これで、少なくともコードのプロトコル部分を記述できるはずです。それでも、ZeroMQソケットなどを処理する部分を作成する必要があります。
現在、の純粋なJava実装はありません0mq
。あなたが言うように、Java言語バインディングがありますが、それは機能するためにネイティブライブラリを必要とします。ライブラリの純粋なJava置換は、実装するのが簡単ではありません。
2011年8月に開始されたjavazmqプロジェクトは、純粋なJavaでZeroMQのサブセットを実装すると主張しています。現時点では、その完全性についてはよくわかりません。