documentation for Socket#recv()
гласит:Как обрабатывать ошибки с помощью JZMQ?
Возвращает: [...] NULL в случае ошибки.
Как я могу определить, что произошло? Я хочу обрабатывать EAGAIN
специально.
documentation for Socket#recv()
гласит:Как обрабатывать ошибки с помощью JZMQ?
Возвращает: [...] NULL в случае ошибки.
Как я могу определить, что произошло? Я хочу обрабатывать EAGAIN
специально.
У меня очень ограниченные знания здесь, но от взглядов его, ответ может быть:
«Если Socket#recv()
возвращает нуль и не 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;
То, что я прочитал здесь, что если что-то пойдет не так, вы получите ZMQException
в Java , если только ошибка была EAGAIN
и zmq_msg_close
не пошла не так (я не уверен, что zmq_msg_close
делает, но я предполагаю, что это редко идет не так).
Но у меня нет среды для проверки этого, и я тоже не понимаю , как работает raise_exception
(источник в util.cpp): Что произойдет, если два исключения подняты/выброшены в один и тот же путь кода (например, когда err
не EAGAIN и rc < 0
), и вы можете уловить только одно исключение во время выполнения в Java?
На стороне записки, была добавлена поддержка для кода ошибки EAGAIN в this commit 15 мая 2015.
исходный код:
/**
* 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);
}
}
так что вы можете изменить ПРИЕМ (INT флаги) и mayRaise()
Да! Кажется, это так. Благодаря! – rightfold