このプログラムを使用して、PULL
ソケットをテストしていますROUTER
。を作成/バインドROUTER
し、ID を持つ PULL ソケットをそれに接続します。次に、ROUTER
その ID を使用してクライアント専用にアドレス指定されたメッセージを送信します (基本的な zeromq エンベロープ)
テストプログラム
public static void main(String[] o){
ZContext routerCtx = new ZContext();
Socket rtr = routerCtx.createSocket( ZMQ.ROUTER);
rtr.setRouterMandatory(true);
rtr.bind("tcp://*:5500");
ZContext clientCtx = new ZContext();
Socket client1 = clientCtx.createSocket( ZMQ.PULL);
client1.setIdentity("client1".getBytes());
client1.connect("tcp://localhost:5500");
try{
//Thread.currentThread().sleep(2000);
rtr.sendMore("client1");
rtr.sendMore("");
rtr.send("Hello!");
System.out.println( client1.recvStr());
System.out.println("Client Received: " + client1.recvStr());
}catch(Exception e1){
System.out.println( "Could not send to client1: " + e1.getMessage());
}
routerCtx.destroy();
clientCtx.destroy();
}
結果
予想される結果はprintClient Received: Hello!"
ですが、ROUTER はアドレス指定できないメッセージと一致する例外をスローします。このような状況でその例外をスローするために使用setRouterMandatory(true)
していますが、クライアントは明示的に ID を設定し、サーバーはその ID に送信するため、例外が発生する理由がわかりません。
一時的な修正
コメントを外してわずかな遅延を追加するThread.currentThread().sleep(2000);
と、メッセージは正常に配信されますが、スリープと待機の使用を軽蔑し、厄介で脆弱なコードを作成しますが、さらに重要なことに、「なぜ?」に答えません。
質問
- なぜこうなった?「後期参加」は PUB/SUB ソケットにのみ適用されると理解していました。
- PULL with ROUTER は無効なソケットの組み合わせですか? チャット プログラムに使用していますが、この問題を除けば、うまく機能します。