ZeroMQ:在线程“Timer-0”中获取异常org.zeromq.ZMQException:重试时无法在当前状态(0x9523dfb)下完成操作

时间:2013-02-01 15:32:07

标签: java zeromq

我有这个senario: 尝试发送到服务器的客户端,但服务器处于脱机状态。 socket.send(request,0);在java里面的定时器线程:

这是线程运行() 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)时;在第二轮即将到来:

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);

1 个答案:

答案 0 :(得分:1)

从代码中不清楚,但看起来你在一个线程上创建套接字,并在另一个线程上使用它。

ZeroMQ套接字必须才能在创建它的线程上使用。另一方面,一个ZeroMQ上下文通常足以满足应用程序。

使用ZeroMQ套接字在消息循环中更方便:套接字在循环之前创建并在其之后销毁。实际上,不需要定时器/监视器等,ZeroMQ本身提供同步原语。

我建议在ZeroMQ指南中查看这些章节:

  

Multithreading with ØMQ

     

Chapter 3 - Advanced Request-Reply Patterns