我在nodeJS中使用了zeroMQ。但似乎在将数据从生产者发送到worker时,如果我没有将它放在setInterval中,那么它就不会将数据发送给worker。我的示例代码如下:
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中?或者我做错了什么?
答案 0 :(得分:2)
问题隐藏在node.js的zmq绑定中。我刚刚花了一些时间深入研究它,它基本上是在send()上进行的:
现在问题在于刷新部分,因为它确实
在你的代码中,因为你调用bind并立即发送,所以在通话时没有连接工作人员,因为他们根本没有足够的时间注意到。所以消息被排队,我们正在等待一些工人出现。现在有趣的部分 - 我们在哪里检查新员工?在发送功能本身!因此,除非我们稍后调用send(),否则当实际连接了一些工作程序时,我们的消息永远不会被刷新并且它们会永久排队。这就是setInterval工作的原因,因为工人有足够的时间注意和连接,你定期检查是否有。
您可以在https://github.com/JustinTulloss/zeromq.node/blob/master/lib/index.js#L277找到有趣的部分。
干杯; - )