我正在使用ZeroMQ进行发布订阅。这是一个简化的代码:
import zmq from 'zeromq';
import d from 'debug';
const debug = d('publisher');
let port = '8000';
let subject = 'FLIGHTS';
const socket = zmq.socket('pub');
socket.on('close', function(...toto) {
debug('connection closed');
});
socket.on('close_error', function(...toto) {
debug('error while closing connexion');
});
socket.monitor(10, 0);
socket.bindSync('tcp://*:' + port);
export function send(message: object) {
const jsonMessage = JSON.stringify(message);
socket.send([subject, jsonMessage]);
}
export function close() {
socket.close();
}
setTimeout( () => close(), 3000 );
我遇到的问题是,即使套接字在3秒后关闭,该进程也不会退出。我无法使用process.exit
,因为我正在制作的模块用于很多测试。
我在ZeroMQ documentation中找不到任何内容。
答案 0 :(得分:1)
鉴于默认的ZeroMQ API规范,任何对 .close()
套接字实例的尝试都会阻塞,直到一定时间到期。
典型的优雅终止序列依赖于在创建时预先设置此实例属性的做法:
socket.setsockopt( zmq.LINGER, 0 ); // A SYSTEMATIC STEP UPON CREATION
ZMQ_LINGER
:设置套接字关闭的停留时间
ZMQ_LINGER
选项应设置指定套接字的延迟时间。延迟时间段确定在套接字与zmq_disconnect()
断开连接或用zmq_close()
关闭后,尚未发送给对等方的待处理消息将在内存中停留多长时间,并进一步影响套接字上下文的终止与zmq_ctx_term()
。以下概述了不同的行为:
- 值 -1 指定无限逗留期。拨打zmq_disconnect()
或zmq_close()
后,不得丢弃待处理的消息;尝试使用zmq_ctx_term()
终止套接字的上下文时,应阻止所有未决消息发送给对等方。
- 0 的值指定没有逗留期限。在致电zmq_disconnect()
或zmq_close()
后,应立即放弃待处理的讯息。
- 正值指定逗留时段的上限(以毫秒为单位)。拨打zmq_disconnect()
或zmq_close()
后,不得丢弃待处理的消息;尝试使用zmq_ctx_term()
终止套接字的上下文将阻塞,直到所有未决消息都已发送到对等方,或者延迟时间到期,之后应丢弃任何未决消息。
默认值~30000 [ms](适用于所有套接字类型)
有关各自的详细信息,请阅读ZeroMQ API文档。