2016-06-20 78 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

相關問題