2016-06-20 4 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に明示的に電話をかけなければなりません。

関連する問題