我正在使用zeromq将消息从node.js服务器推送到我的worker.我router在node.js端创建了一个套接字
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!');
}
Run Code Online (Sandbox Code Playgroud)
并使用dealerworker代码中的a连接到此地址.
当工作者在绑定之前首先连接(不总是,但经常)时,会出现问题.这应该不是关于zeromq文档的问题,所以我认为这是node.js绑定中的问题,问题是我该如何解决这个问题?
此外,我可以赶上这个异常的问题Socket is busy中process.on('uncaughtException',...),而不是在bind功能
我应该提一下,我在Windows 7 64bit上这样做.
问题可能是您正在使用bind(),实际上您应该使用bindSync().当您读取源代码时,您会发现异步bind()实际上会锁定套接字并在每次对其执行任何操作时检查锁定.您可能遇到的是工作程序在套接字解锁之前连接,因此它会抛出异常.只需用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!
Run Code Online (Sandbox Code Playgroud)
所以你可以调用bindSync()而不关心,或者调用bind()并继续回调中的工作,但你绝对不能使用bind()并继续而不等待它完成.bindSync()使代码更易于读取,但在调用期间阻塞整个node.js实例.所以我认为bind()方式更干净,应该使用node.js ...
希望这有帮助;-)
| 归档时间: |
|
| 查看次数: |
1937 次 |
| 最近记录: |