我正在使用zeromq将消息从node.js服务器推送到我的worker。我在node.js端创建了一个router
套接字
var sender = zmq.socket('router');
sender.bind('tcp://127.0.0.1:6633', function(err) {
if (err) {
console.log( 'Error binding socket' );
return;
}
console.log('OK!');
}
并使用worker代码中的dealer
连接到此地址。
当工作者在绑定之前首先连接时(不总是,但经常),会出现问题。对于zeromq文档,这不应该是一个问题,所以我认为这是node.js binding中的一个问题,问题是如何解决这个问题?
还有一个问题,我可以在Socket is busy
中捕获此异常process.on('uncaughtException',...)
,而不是bind
函数
我应该提一下,我在Windows 7 64bit上这样做。
答案 0 :(得分:5)
问题可能是您正在使用bind(),实际上您应该使用bindSync()。当您阅读源代码时,您会发现async bind()实际上是locks the socket和checks the lock every time您使用它做了什么。您可能遇到的是工作程序在套接字解锁之前连接,因此它会抛出异常。只需用bindSync()替换bind()就可以了。然而,这不是我想的一个想法解决方案,或者更确切地说不是node.js-ish。让我们来说明我的意思:
var zmq = require('zmq')
, sender;
sender = zmq.socket('router');
sender.bind('tcp://127.0.0.1:6633', function(err) {
if (err) {
console.log( 'Error binding socket' );
return;
}
sender.close(); // This is fine! The socket is ready!
});
sender.close(); // This is wrong! The socket is not ready yet!
所以你可以调用bindSync()而不关心,或者调用bind()并继续回调中的工作,但你绝对不能使用bind()并继续而不等待它完成。 bindSync()使代码更易于读取,但是在调用期间阻塞整个node.js实例。所以我认为bind()方式更加干净,应该使用node.js ......
希望这有帮助; - )