0

我有这个场景:客户端尝试发送到服务器,但服务器处于脱机状态。socket.send(request, 0); 在 java Timer 线程内部:

这是 ZMQ.Socket m_socket 在线程外启动的线程 run()

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

1 回答 1

1

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

ZeroMQ 套接字必须在创建它的线程上使用。另一方面,一个 ZeroMQ 上下文对于应用程序来说通常就足够了。

在消息循环中使用 ZeroMQ 套接字要方便得多:套接字在循环之前创建并在循环之后立即销毁。真的,不需要计时器/监视器等,ZeroMQ 本身提供同步原语。

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

ØMQ的多线程

第 3 章 - 高级请求-回复模式

于 2013-02-01T16:56:52.417 回答