我需要为使用0MQ的答复/请求事务添加超时。通常如何完成?我尝试使用该方法:
socket.setReceiveTimeOut();
和
socket.setSendTimeout();
但是它们似乎导致空指针异常。
本质上,如果接收请求的应用程序不可用,我希望应用程序在10秒后超时。
感谢您的帮助。
谢谢!
答案 0 :(得分:0)
通常如何完成[答复/请求事务的超时]?
我感到非常难过,确认,有没有这样的ZeroMQ本地的API中。进行异步传递的原理意味着,传递的发生没有限制(在尽力而为的调度模型中,或者根本没有)。
如果是ZeroMQ的新手,您可以在[ ZeroMQ hierarchy in less than a five seconds ]部分中快速阅读一下这5秒的主要概念元素。
我希望...超时 10秒后如果 ...接收到请求不是... < / em>
可以将 .recv()
方法的呼叫设计设计为经过 .poll( 10000 )
方法筛选器的预先测试/受保护,仅在先前准备接受POSACK的消息准备发布到本地之前,才发出(或不发出)对实际.recv()
方法的调用之前,显式检测是否确实存在已传递给您的应用程序代码的消息通过调用标记为.recv( ZMQ_NOBLOCK )
的标记为不花费毫秒“ there”的方法,使用具有方法的非阻塞形式的处理程序来读取或可能使用更多的“原始”方法现在,没有消息可以从本地 Context()
引擎实例中读取,并且可以在您的代码中相应地处理每种情况。
还请注意,使用 REQ/REP
-Scalable Formal Communication Archetype模式不会更容易,因为存在强制性的两步跳舞(当然,如果而不是有意地ZMQ_RELAXED
),因此两个FSA背对背连接的FSA仍然必须等待下一个“预期的”远程事件,才有机会进行处理下一个本地事件。如果对细节感兴趣,将会发现很多关于不可避免的,无法挽回的相互僵局的帖子,REQ/REP
肯定会发生,我们只不知道它何时发生,但可以肯定。
答案 1 :(得分:0)
我想知道您的空指针是否与套接字的创建方式有关。我过去已经成功设置了套接字超时。
当我使用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. */
}
}
}
答案 2 :(得分:0)
我认为在Recv超时时,jzmq应该抛出ZMQException
,
但是当ZMQException
时没有err = EAGAIN
。
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;
}