2015-12-01 2 views

ответ

1

У меня очень ограниченные знания здесь, но от взглядов его, ответ может быть:
«Если 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.

+0

Да! Кажется, это так. Благодаря! – rightfold

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); 
      } 
     } 

так что вы можете изменить ПРИЕМ (INT флаги) и mayRaise()

Смежные вопросы