2016-06-20 2 views
0

Этот небольшой тестовый скрипт показывает мою проблему. Он будет отправлять сообщения, закрывать все сокеты, а затем просто ждать и никогда не выходить. Предположительно, установка ZMQ_LINGER на 0 должна немедленно отменить все сообщения в очереди, так почему же это не позволяет моему процессу Node.js выйти?Как я могу гарантировать, что ZeroMQ не блокирует ожидание сообщений после закрытия сокетов?

const zmq = require('zmq') 

const bindUrl = 'tcp://127.0.0.1:4000' 
let timer 

let publisher = zmq.socket('pub') 
publisher.monitor(500, 0) 
publisher.setsockopt(zmq.ZMQ_LINGER, 0) 
publisher.bind(bindUrl) 

let subscriber = zmq.socket('sub') 
subscriber.monitor(500, 0) 
subscriber.setsockopt(zmq.ZMQ_LINGER, 0) 
subscriber.connect(bindUrl) 

subscriber.on('connect_error',() => { 
    console.log('connect error') 
}) 

subscriber.on('connect',() => { 
    subscriber.subscribe('some topic') 
}) 

publisher.on('bind', function() { 
    console.log('bound') 
    timer = setInterval(() => publisher.send(['some topic', 'blah']), 1000) 
}) 

publisher.on('bind_error', function() { 
    console.log('bind error') 
}) 

subscriber.on('disconnect', function() { 
    console.log('subscriber disconnected') 
    subscriber.close() 
}) 

subscriber.on('close', function() { 
    console.log('subscriber closed') 
    subscriber.removeAllListeners() 
    subscriber = null 
}) 

publisher.on('unbind', function() { 
    console.log('publisher unbound') 
    publisher.close() 
}) 

publisher.on('close', function() { 
    console.log('publisher closed') 
    publisher.removeAllListeners() 
    publisher = null 

    subscriber.disconnect(bindUrl) 
}) 

subscriber.on('message', function (topic, message) { 
    console.log(topic.toString(), message.toString()) 
    clearInterval(timer) 
    subscriber.unsubscribe('some topic') 
    publisher.unbind(bindUrl) 
}) 

Выход следующий: процесс никогда не выходит.

[email protected]:~/$ node test-disconnect.js 
bound 
some topic blah 
publisher unbound 
publisher closed 
subscriber disconnected 
subscriber closed 

ответ

1

Тот факт, что я напрямую контролирую сокеты, вызвал такое поведение. Я должен явно позвонить socket.unmonitor, когда я буду готов к завершению процесса.