我正在使用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文档里什么也没发现。
发布于 2017-05-12 02:31:36
给定默认的套接字API规范,任何.close()
套接字实例的尝试都是阻塞的,直到一定时间到期为止。
典型的优雅终止序列依赖于在创建实例属性时预先设置该实例属性的实践:
socket.setsockopt( zmq.LINGER, 0 ); // A SYSTEMATIC STEP UPON CREATION
ZMQ_LINGER
:设置套接字关闭的逗留期ZMQ_LINGER
选项应设置指定套接字的逗留周期。逗留期间确定,在套接字断开与zmq_disconnect()
连接或与zmq_close()
关闭后,尚未发送给对等方的挂起消息将在内存中逗留多久,并进一步影响套接字上下文的zmq_ctx_term()
终止。以下概述了不同的行为:
zmq_disconnect()
或zmq_close()
之后,不应丢弃挂起的消息;试图使用zmq_ctx_term()
终止套接字上下文的尝试将被阻塞,直到将所有挂起的消息发送给对等方为止。zmq_disconnect()
或zmq_close()
后立即丢弃。zmq_disconnect()
或zmq_close()
之后,不应丢弃挂起的消息;试图使用zmq_ctx_term()
终止套接字上下文的尝试将被阻塞,直到所有挂起的消息都已发送到对等端,或者逗留期到期,之后将丢弃任何挂起的消息。默认值~ 30000 女士有关详细信息,请参阅ZeroMQ API文档。
https://stackoverflow.com/questions/43924659
复制