0

私はこのシナリオを持っています: サーバーに送信しようとするクライアントですが、サーバーはオフラインです。socket.send(リクエスト、0); Javaタイマースレッド内:

これはスレッドです run() ZMQ.Socket m_socket はスレッド外で開始されます

public void run() {

  m_socket.send(request, 0);
 byte[] reply = m_socket.recv(0);
 //get seperator
 byte[] empty1 = m_socket.recv(0);
 //get secound frame
  byte[] byteFileStruct = m_socket.recv(0);  
  if(null!=reply)  // this is indication that the server is offline , is there better way to check ? 
  {
    ......
  }

}

ここで、Timer は run() メソッドを再びトリガーし、m_socket.send(request, 0); を実行すると、2番目のラウンドで取得:

Exception in thread "Timer-0" org.zeromq.ZMQException: Operation cannot be accomplished in current state(0x9523dfb)
    at org.zeromq.ZMQ$Socket.send(Native Method)
    at com.agent.core.Poller$PollarWorker.run(Poller.java:155)
    at java.util.TimerThread.mainLoop(Unknown Source)
    at java.util.TimerThread.run(Unknown Source)

ラウンドごとに新しいソケットを作成する必要がありますか? それはこれです:

 m_context = ZMQ.context(1);
        m_socket = m_context.socket(ZMQ.REQ);
        m_socket.setReceiveTimeOut(2000);
        m_socket.setSendTimeOut(2000);
        m_socket.connect (sControllerDomain);
4

1 に答える 1

1

コードからは明らかではありませんが、あるスレッドでソケットを作成し、別のスレッドで使用しているようです。

ZeroMQ ソケットは、それが作成されたスレッドで使用する必要があります。一方、アプリケーションには通常、1 つの ZeroMQ コンテキストで十分です。

メッセージ ループでは、ZeroMQ ソケットを使用する方がはるかに便利です。ソケットはループの前に作成され、ループの直後に破棄されます。実際、タイマー/モニターなどは必要ありません。ZeroMQ 自体が同期プリミティブを提供します。

ZeroMQ ガイドの次の章を確認することをお勧めします。

ØMQ によるマルチスレッド化

第 3 章 - 高度な要求応答パターン

于 2013-02-01T16:56:52.417 に答える