我正在使用 zeromq将消息从 node.js 服务器推送到我的工作人员。我在 node.js 端创建了一个 router
socket
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!');
}
并通过工作代码中的dealer
连接到这个地址。
当 worker 在 bind 之前首先连接时会出现问题(并非总是如此,但经常发生)。这应该不是关于 zeromq 文档的问题,所以我认为这是 node.js binding 中的问题。 ,问题是我该如何解决这个问题?
还有一个问题,我可以在 process.on('uncaughtException',...)
中捕获此异常 Socket is busy
,而不是在 bind 中
函数
我应该提到我是在 Windows 7 64 位上执行此操作的。
最佳答案
问题可能是您在实际上应该使用 bindSync() 的地方使用了 bind()。当您阅读源代码时,您会发现异步 bind() 实际上是 locks the socket和 checks the lock every time你用它做任何事。您可能遇到的情况是,一个工作人员在套接字解锁之前进行连接,因此它会抛出异常。只需将 bind() 替换为 bindSync() 对我有用。然而,这不是我猜想的理想解决方案,或者更确切地说不是 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 的方式上更干净......
希望这对您有所帮助 ;-)
关于node.js - 绑定(bind)前连接时套接字忙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14322599/