我在nodeJS中使用zeroMQ。但似乎在将数据从生产者发送到工作人员时,如果我不将其放入 setInterval 中,那么它不会将数据发送到工作人员。我的示例代码如下:
producer.js
===========
var zmq = require('zmq')
, sock = zmq.socket('push');
sock.bindSync('tcp://127.0.0.1:3000');
console.log('Producer bound to port 3000');
//sock.send("hello");
var i = 0;
//1. var timer = setInterval(function() {
var str = "hello";
console.log('sending work', str, i++);
sock.send(str);
//2. clearTimeout(timer);
//3. }, 150);
sock.on('message', function(msg) {
console.log("Got A message, [%s], [%s]", msg);
});
所以在上面的代码中,如果我添加回1、2和3中注释的行,那么我确实会收到消息到工作端,否则它不起作用。
任何人都可以阐明为什么发送消息我需要将其放入 setInterval 中吗?还是我做错了什么?
最佳答案
问题隐藏在 Node.js 的 zmq 绑定(bind)中。我刚刚花了一些时间深入研究它,它基本上是在 send() 上执行此操作的:
- 将消息放入队列
- 刷新缓冲区
现在问题出在冲洗部分,因为它确实
- 检查输出套接字是否就绪,否则返回
- 刷新排队的消息
在您的代码中,因为您调用绑定(bind)并立即发送,所以在调用时没有工作人员连接,因为他们根本没有足够的时间来注意到。因此消息已排队,我们正在等待一些工作人员出现。现在有趣的部分 - 我们在哪里检查新 worker ?在发送函数本身!因此,除非我们稍后调用 send() ,否则当实际上有一些工作人员连接时,我们的消息永远不会刷新,并且它们会永远排队。这就是 setInterval 起作用的原因,因为工作人员有足够的时间来注意和连接,并且您会定期检查是否有任何情况。
您可以在 https://github.com/JustinTulloss/zeromq.node/blob/master/lib/index.js#L277 找到有趣的部分.
干杯;-)
关于node.js - nodeJS ZeroMQ : why cant send message if sock. 未在 setInterval 中发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14138356/