我正在开发一个侦听消息队列(ActiveMQ)的node.js组件,并将收到的消息批量添加到redis中(每批必须为20个)。
从ActiveMQ收到的消息数量是每秒10次或更少时没有问题。
我的问题是消息每4毫秒被添加到队列中。这导致批次中添加的记录数有时超过每批20个。
const stompit = require('stompit');
var uuid = require('node-uuid');
var Redis = require('ioredis');
var redis = new Redis();
var pipeline = redis.pipeline();
var batchCounter = 0;
stompit.connect({ host: 'localhost', port: 61613 }, function(err1, client) {
client.subscribe({ destination: 'MyQueue' }, function(err2, msg) {
msg.readString('UTF-8', function(err3, body) {
if (batchCounter >= 20){
pipeline.exec(function(err4, results) {
pipeline = redis.pipeline();
batchCounter = 0;
console.log(results);
});
}
batchCounter++;
pipeline.set(uuid.v1(), JSON.stringify(body));
//client.disconnect();
});
});
});
如何解决这个问题? 谢谢
答案 0 :(得分:0)
尝试在调用.exec
方法之前重置管道,我假设这是一种异步方法。由于.exec
将来会在某个时间点运行,因此增量和pipeline.set
可以在它之前运行。
以下代码保存当前管道并在.exec
if (batchCounter >= 20){
let fullpipeline = pipeline;
pipeline = redis.pipeline();
batchCounter = 0;
fullpipeline.exec(function(err4, results) {
console.log(err4, results);
});
}
然后,新邮件应该只附加到新管道。
答案 1 :(得分:0)
我最终使用标志控制每批记录的数量。我相信还有另一种可能的,可能更有效的解决方案,它控制从ActiveMQ读取的过程。但是,在这种情况下,旗帜为我做了工作。使用标志的完整代码位于以下链接中:
https://github.com/TamerB/ToActiveMQToRedis/blob/master/consumer/app.js