我有这个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);
答案 0 :(得分:1)
从代码中不清楚,但看起来你在一个线程上创建套接字,并在另一个线程上使用它。
ZeroMQ套接字必须才能在创建它的线程上使用。另一方面,一个ZeroMQ上下文通常足以满足应用程序。
使用ZeroMQ套接字在消息循环中更方便:套接字在循环之前创建并在其之后销毁。实际上,不需要定时器/监视器等,ZeroMQ本身提供同步原语。
我建议在ZeroMQ指南中查看这些章节: