[英]Definitive fool-proof steps for 0MQ / ZeroMQ and Java on Windows 7?
[英]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.