java - ZeroMQ : getting Exception in thread "Timer-0" org. Zeromq.ZMQException:重试时无法在当前状态(0x9523dfb)下完成操作

标签 java zeromq

我有这样的情况: 客户端尝试发送到服务器,但服务器离线。 socket.send(请求, 0);在 java Timer 线程内部:

这是线程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 ? 
  {
    ......
  }

}

现在定时器在执行 m_socket.send(request, 0); 时再次触发 run() 方法;在第二轮中我得到:

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

最佳答案

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

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

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

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

Multithreading with ØMQ

Chapter 3 - Advanced Request-Reply Patterns

关于java - ZeroMQ : getting Exception in thread "Timer-0" org. Zeromq.ZMQException:重试时无法在当前状态(0x9523dfb)下完成操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14649666/

相关文章:

java - 无法转换为已实现的接口(interface)

java - 冲洗物体的正确位置

c++ - 使用 Flatbuffer Union 通过 ZeroMQ 发送不同的事件

c# - ZeroMq 发布子地址不可用

java - spring-boot 健康未显示详细信息(withDetail info)

java - 为什么Java编译器不理解这个变量总是被初始化?

JAVA - 我是否应该在使用后为每个实例化对象设置 null?

go - ZeroMq Golang 绑定(bind)无法在 Windows 上构建

php - Symfony2 WebSocketBundle - ZMQ 推送不起作用

c++ - ZeroMQ 与 fork 服务器中的所有子进程共享上下文