在绑定之前连接时套接字正忙

bal*_*azs 3 zeromq node.js

我正在使用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 busyprocess.on('uncaughtException',...),而不是在bind功能

我应该提一下,我在Windows 7 64bit上这样做.

tch*_*hap 7

问题可能是您正在使用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 ...

希望这有帮助;-)