首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中如何设置0MQ ( ZeroMQ )的超时时间?

在Java中如何设置0MQ ( ZeroMQ )的超时时间?
EN

Stack Overflow用户
提问于 2018-06-29 04:20:01
回答 2查看 1.4K关注 0票数 2

我需要使用0MQ为应答/请求事务添加超时。这通常是如何实现的?我试着使用下面的方法:

代码语言:javascript
复制
socket.setReceiveTimeOut();

代码语言:javascript
复制
socket.setSendTimeout();

但它们似乎会导致空指针异常。

实际上,如果接收请求的应用程序不可用,我希望应用程序在10秒后超时。

任何帮助都是非常感谢的。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 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

代码语言:javascript
复制
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;
}
票数 1
EN

Stack Overflow用户

发布于 2018-06-30 02:43:45

我想知道您的空指针是否与您的套接字是如何创建的有关。我在过去成功地设置了套接字超时。

当我使用JeroMQ库(ZMQ的原生Java实现)时,下面的方法对我很有效。我使用它来帮助通过ZMQ执行REQ-REP命令。

代码语言:javascript
复制
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. */
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51090670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档