gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:53:01 25 4
gpt4 key购买 nike

我有这样的情况:客户端尝试发送到服务器,但服务器离线。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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com