2016-06-20 4 views
0

Dieses kleine Testskript zeigt mein Problem. Es wird Nachrichten senden, alle Sockets schließen und dann einfach warten, niemals beenden. Angeblich soll ZMQ_LINGER auf 0 gesetzt werden, um alle in der Warteschlange befindlichen Nachrichten sofort zu verwerfen. Warum also darf mein Node.js-Prozess nicht beendet werden?Wie kann ich sicherstellen, dass ZeroMQ das Warten auf Nachrichten nach dem Schließen von Sockets nicht blockiert?

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) 
}) 

Die Ausgabe ist die folgende, und der Prozess wird nie beendet.

Antwort

1

Die Tatsache, dass ich explizit die Sockets überwache, hat dieses Verhalten verursacht. Ich muss explizit socket.unmonitor aufrufen, wenn ich bereit bin, den Prozess zu beenden.

Verwandte Themen