我需要使用0MQ为应答/请求事务添加超时。这通常是如何实现的?我试着使用下面的方法:
socket.setReceiveTimeOut();
和
socket.setSendTimeout();
但它们似乎会导致空指针异常。
实际上,如果接收请求的应用程序不可用,我希望应用程序在10秒后超时。
任何帮助都是非常感谢的。
谢谢!
发布于 2019-11-07 16:33:39
我认为jzmq应该在recv超时抛出一个ZMQException
,但是当err = EAGAIN
超时时没有ZMQException
。
https://github.com/zeromq/jzmq/blob/master/jzmq-jni/src/main/c%2B%2B/Socket.cpp
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;
}
发布于 2018-06-30 02:43:45
我想知道您的空指针是否与您的套接字是如何创建的有关。我在过去成功地设置了套接字超时。
当我使用JeroMQ库(ZMQ的原生Java实现)时,下面的方法对我很有效。我使用它来帮助通过ZMQ执行REQ-REP命令。
ZMQ.Context context = ZMQ.context(1);
ZMQ.Socket sock = context.socket(ZMQ.REQ);
sock.setSendTimeOut(10000); // 10 second send timeout
sock.setReceiveTimeOut(10000); // 10 second receive timeout
if (sock.connect("tcp://127.0.0.1:1234")) {
if (sock.send(/* insert data here */)) {
/* Send was successful and did not time out. */
byte[] replyBytes = null;
replyBytes = sock.recv();
if (null == replyBytes) {
/* Receive timed out. */
} else {
/* Receive was successful. Do something with replyBytes. */
}
}
}
https://stackoverflow.com/questions/51090670
复制相似问题