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

时间:2013-01-14 16:36:13

标签: node.js zeromq

我正在使用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上这样做。

1 个答案:

答案 0 :(得分:5)

问题可能是您正在使用bind(),实际上您应该使用bindSync()。当您阅读源代码时,您会发现async bind()实际上是locks the socketchecks 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 ......

希望这有帮助; - )