答案 0 :(得分:1)
我的知识非常有限,但从它的外观来看,答案可能是:
"如果Socket#recv()
返回null且没有抛出ZMQException
,则会发生EAGAIN错误。"
我按照方法调用并在do_read
Socket.cpp
处到达
它在line 83上变得有趣:
rc = zmq_recv (socket, message, flags);
int err = zmq_errno();
if (rc < 0 && err == EAGAIN) {
rc = zmq_msg_close (message);
err = zmq_errno();
if (rc != 0) {
raise_exception (env, err);
return NULL;
}
return NULL;
}
if (rc < 0) {
raise_exception (env, err);
rc = zmq_msg_close (message);
err = zmq_errno();
if (rc != 0) {
raise_exception (env, err);
return NULL;
}
return NULL;
}
return message;
我在这里读到的是,如果出现问题,您将获得Java中的ZMQException
除非错误为EAGAIN
且zmq_msg_close
没有出错
(我不确定zmq_msg_close
做了什么,但我认为它很少出错)。
但我没有环境来测试这个,我也不太懂
raise_exception
的工作原理(来自util.cpp):
如果在同一代码路径中引发/抛出两个异常会发生什么(例如,当err
不是EAGAIN和rc < 0
时),并且您只能在Java中捕获一个运行时异常?
在旁注中,添加了对EAGAIN错误代码的支持 this commit 2015年5月15日。
答案 1 :(得分:0)
源代码是:
/**
* Receive a message.
*
* @return the message received, as an array of bytes; null on error.
*/
public final byte[] recv()
{
return recv(0);
}
/**
* Receive a message.
*
* @param flags
* the flags to apply to the receive operation.
* @return the message received, as an array of bytes; null on error.
*/
public final byte[] recv(int flags)
{
zmq.Msg msg = base.recv(flags);
if (msg != null) {
return msg.data();
}
mayRaise();
return null;
}
private void mayRaise()
{
int errno = base.errno();
if (errno != 0 && errno != zmq.ZError.EAGAIN) {
throw new ZMQException(errno);
}
}
所以你可以改变recv(int flags)和mayRaise()函数