ZMQ(java)-遭遇した問題

3739 ワード

私は疑問があります。なぜ現地でMDファイルを作成したのですか?レイアウトはまだ整っていますが、CSDNに来たら混乱しますか?いつやっと大神が出てきて、代わりの道を行って、MDの文法を統一します!
  • publisher.bind("ipc://weather」-->Protocol not supported(0 x 87)
  • i文をpublisher.bindに変更します。inproc://weather」
  • ipcはOS上のものです。windowsはこのプロトコルをサポートしていません。
  • inprocの定義The in-process transport passes message via memory directly between threads shring a singleØMQ context.
  • inproc://name ここのnameはスレッド
  • を識別する文字列である。
  • inprocとipc
  • inprocはipcの代替版ではありません。ipcはepollでのプロセス通信です。inportはスレッド通信です。ipcはPOSIX標準のオペレーティングシステムだけにあります。
  • inprocクライアントは、メッセージ
  • を受信できません。
  • は、なぜinportがクライアントのメッセージを受信できないのか分かりません。ソースは以下の通りです。
  • 異なるスレッド間で同じcontextを共有しなければならない。正直ZMQのcontextは…
  • 怪しげなZMQスレッド
    簡単なREP&REQモードです。クライアントが一つしかない場合、サーバーにはいくつのスレッドがありますか?ポーリングの方式によって、クライアントがいくらアクセスしても、サーバーはスレッドだけが必要です。java独自の性能分析器を使ってスレッド数を確認する。
  • 普通スレッド
    public class Server2 {
        public static void main(String[] args) {
            new ServerThread().start();
            new ClientThread("10001").start();
        }
    }
    publisher.bind("inproc://weather");
    subscriber.connect("inproc://weather");
    
  • は、スレッドの内容を印刷する。
  • Reference Handler
  • Finalizer
  • Signal Displatch
  • Attach Listener
  • main
  • Thread-0
  • ガードスレッドを除くと、メインとThread-0
  • だけです。
  • 以下でJServer.class運転後
  • は、スレッドの内容を印刷する。
  • Reference Handler
  • Finalizer
  • Signal Displatch
  • Attach Listener
  • main
  • したがって、メッセージはポーリングで処理される。
  • 高級要求応答におけるROUTER to Nウォーカー(REQ)負荷バランスに関する規則
  • P 96の例では、代理人が最近最も少なく使われている規則に従って労働者に任務を分配することを説明しています。そのために、まず労働者の勤務時間を400ミリ秒に変更して、任務を取得した労働者IDの順番をプリントしました。以下は切り取りの前半部分の結果です。この結果から見ると、最初の10人は10人の労働者がランダムに順番に取りに来る任務で、11番目から規則に従い、0人目の労働者に任務を割り当てるべきですが、実際には6人目の労働者に任務を割り当てました。
  • 0 8 1 4 7 5 2 6 9 1 4 4 4 4 4 4 4 5 5 6 1 4 4 4 4 4 4 1 0 5 5 2 6 6 1 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 1 0 4 7 2 2 2 2 2
  • 本の紹介によると、java版の例はhttps://github.com/imatix/zguide2/tree/master/examples/Javaにありますが、実行できない例があります。
  • バージョンアップの問題で、初期バージョンのAPIが変化し、廃棄されたり、別の名前に変更されたりしました。本機では下記のコードを実行し、バージョン番号を取得することができます。System.out.println(String.format("Version string: %s, Version int: %d", ZMQ.getVersionString(), ZMQ.getFullVersion()));私の出力:Version string: 4.1.4, Version int: 40104
  • while(1)の翻訳方式。本のほとんどの例では、while(1)のサイクルがあり、サイクルオーバーで資源回収が行われています。javaの例を提供してwhile(true)に訳します。while(true)に訳せば、文法規則により、whileには循環を終了する語句がないため、後文はコードを作成することができません。つまり、ここが異常終了した場合、リソースは正確に回収されません。厳密な書き方はwhile(!Thread.currentThread().isInterrupted())です。
  • APIの変化
  • mspoller.java ZMQ.Poller items = context.poller(2);ZMQ.Poller items = new ZMQ.Poller(2);
  • に変更すべきです。
  • ms reader.java while((task = receiver.recv(ZMQ.NOBLOCK)) != null)while((task = receiver.recv(ZMQ.DONTWAIT)) != null)
  • に変更すべきです。
  • 文法エラー
  • msgqueue.java ZMQQueue queue = new ZMQQueue(context, frontend, backend);の次の行に追加するべきです。
  • にあるAPIは存在しない。公式の例によると、mdcliapi.java
  • public class SimpleThread extends Thread{
        public static void main(String[] args) {
            new Thread(() -> { while(true) System.out.println("."); }).start();
        }
    }
    
    public ZMsg send(String service, ZMsg request) {
        request.push(new ZFrame(service));
        request.push(MDP.C_CLIENT.newFrame());