如何使用JZMQ处理错误?

时间:2015-12-01 19:36:51

标签: java zeromq jzmq

documentation for Socket#recv()读取:

  

返回:[...]出错时为空。

我怎么知道错误是什么?我想具体处理EAGAIN

2 个答案:

答案 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 除非错误为EAGAINzmq_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()函数