簡體   English   中英

如何在 Java 中為 0MQ ( ZeroMQ ) 設置超時?

[英]How to set a timeout for 0MQ ( ZeroMQ ) in Java?

我需要使用 0MQ 為回復/請求事務添加超時。 這通常是如何實現的? 我嘗試使用以下方法:

socket.setReceiveTimeOut();

socket.setSendTimeout();

但它們似乎會導致空指針異常。

本質上,如果接收請求的應用程序不可用,我希望應用程序在 10 秒后超時。

任何幫助表示贊賞。

謝謝!

我認為 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;
}

這 [回復/請求事務超時] 通常是如何完成的?

我很傷心,確認,有沒有這樣的ZeroMQ本地的API中。 進行異步交付的原則意味着,交付的發生沒有限制(在盡力而為的調度模型中,或者根本沒有)。


如果您不熟悉 ZeroMQ,您可能會喜歡快速閱讀這篇 5 秒的文章,了解 [不到五秒的 ZeroMQ 層次結構] 部分中的主要概念元素。

我想......10 秒超時如果......收到請求不是......

可以將您的.recv() -method 調用使​​用設計為經過.poll( 10000 ) -method 篩選器后的預先測試/保護,以首先明確檢測是否存在任何消息,以便確實傳送到您的應用程序代碼,然后曾經(或不)發出對實際.recv()方法的調用,僅在先前的 POSACK-ed 消息准備好在本地讀取時,或者可能使用更“原始”的方法,使用帶有非- 方法的.recv( ZMQ_NOBLOCK )形式,通過調用.recv( ZMQ_NOBLOCK )標記不要在“那里”花費一毫秒,以防“那里”現在沒有從本地端Context()讀取的消息 -引擎實例,並在您的代碼中相應地處理每種情況。


獎勵積分

還要注意的是,使用REQ/REP -Scalable Formal Communication Archetype 模式不會更容易,因為有一個強制性的ZMQ_RELAXED舞(當然,如果不是故意人為的ZMQ_RELAXED ),所以兩個 FSA-back -to-back-connected-FSA-s 仍然必須等待下一個“預期的”遠程事件,然后才能有機會處理下一個本地事件。 如果對細節感興趣,你會發現很多關於不可避免、不可挽救的相互死鎖的帖子,這肯定會發生在REQ/REP ,我們只是不知道它何時發生,但肯定會發生。

我想知道您的空指針是否與您的套接字的創建方式有關。 我過去成功設置了套接字超時。

當我使用 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. */
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM