Я вызвал socket.setReceiveTimeOut (3000) и socket.recv (0) в коде Java, но я не могу отловить исключение, когда тайм-аут для ZMQ-сокета recv, я проверил код jzmq, я думаю, что он не выдает исключениев java, почему?
https://github.com/zeromq/jzmq https://github.com/zeromq/jzmq/blob/master/jzmq-jni/src/main/c%2B%2B/Socket.cpp
/**
* Called by Java's Socket::recv(int flags).
*/
JNIEXPORT jbyteArray JNICALL Java_org_zeromq_ZMQ_00024Socket_recv__I (JNIEnv *env,
jobject obj,
jint flags)
{
zmq_msg_t message;
if (!do_read(env,obj,&message,flags)) {
return NULL;
}
// No errors are defined for these two functions. Should they?
int sz = zmq_msg_size (&message);
void* pd = zmq_msg_data (&message);
jbyteArray data = env->NewByteArray (sz);
if (! data) {
raise_exception (env, EINVAL);
return NULL;
}
env->SetByteArrayRegion (data, 0, sz, (jbyte*) pd);
int rc = zmq_msg_close(&message);
if(rc == -1) {
int err = zmq_errno();
raise_exception (env, err);
return NULL;
}
return data;
}
static
zmq_msg_t *do_read(JNIEnv *env, jobject obj, zmq_msg_t *message, int flags)
{
void *socket = get_socket (env, obj);
int rc = zmq_msg_init (message);
if (rc != 0) {
raise_exception (env, zmq_errno());
return NULL;
}
#if ZMQ_VERSION >= ZMQ_MAKE_VERSION(3,0,0)
rc = zmq_recvmsg (socket, message, flags);
#else
rc = zmq_recv (socket, message, flags);
#endif
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;
}