如何使用已关闭的ZeroMQ套接字终止进程?

时间:2017-05-11 20:08:59

标签: node.js zeromq

我正在使用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中找不到任何内容。

1 个答案:

答案 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文档。