rabbit-config-client
Version:
112 lines (80 loc) • 3.62 kB
JavaScript
const amqp = require('amqplib');
const AmqpBaseClient = require('./amqpBaseClient');
const _ = require('lodash');
let co = require('co');
class AmqpLibRecvClient extends AmqpBaseClient {
constructor(clientName,amqpServerInfo) {
super(clientName,amqpServerInfo);
this.nackRequeueTime = 3000;
};
async reQueue(msg,nackTime)
{
let ctx = this;
setTimeout(function () {
console.log('AmqpLibRecvClient requeue nack msg... ');
/** 2018/7/31 第二个参数,是否拒绝所有的消息,true拒绝所有,false拒绝当前。
lpy-modifyed 第三个参数,是否将此消息重入队列。
*/
ctx.channel.nack(msg, false, true);
},nackTime);
}
async ack(msg)
{
return await this.channel.ack(msg);
}
setNackTime(nackTime)
{
this.nackRequeueTime = nackTime;
}
async createConsumer(queueName,recvFunc,consumerOptions)
{
let curConsumerOptions = {noAck: false};
curConsumerOptions = _.extend(curConsumerOptions,consumerOptions);
return await this.channel.consume(queueName, recvFunc, curConsumerOptions);
}
/** 2018/7/30 创建接收的消费者。 设置重入队列的间隔时间。单位MS.
lpy-modifyed */
async createRecverConsumer(queueName,recvFunc, context,nackTime = 3000) {
let ctx = this;
this.nackRequeueTime = nackTime;
async function onRecvMsg(msg) {
try
{
let msgValue = msg.content.toString();
//console.log("AmqpLibRecvClient->onRecvMsg routingKey:%s data:%s", msg.fields.routingKey, msgValue);
let ret = await recvFunc.call(context, msg);
if (ret) {
ctx.ack(msg);
}
else {
console.log('AmqpLibRecvClient recv msg dispatch failed,msgValue: ' + msgValue);
ctx.reQueue(msg,ctx.nackRequeueTime);
}
/* co.wrap(recvFunc).call(context, msg)
.then(function (ret) {
/!* console.log('AmqpLibRecvClient recv msg dispatch ' + (ret ? 'success' : 'failed')
+ ',msgValue: ' + msgValue );*!/
if (ret) {
ctx.ack(msg);
}
else {
console.log('AmqpLibRecvClient recv msg dispatch failed,msgValue: ' + msgValue);
ctx.reQueue(msg, nackTime);
}
}).catch(function (e) {
console.log('AmqpLibRecvClient recv msg dispatch ,promise error:' + e);
ctx.reQueue(msg, nackTime);
})*/
}
catch(e)
{
console.log('AmqpLibRecvClient recv msg dispatch ,error:' + e);
//ctx.channel.nack(msg, false, true);
ctx.reQueue(msg,ctx.nackRequeueTime);
}
}
await this.createConsumer(queueName,onRecvMsg,{});
return true;
};
}
module.exports = AmqpLibRecvClient;