redis实现消息队列

/**
* @author sam
* @date 2015/04/01
* @desc a message queue
*/
var EventEmitter = require('events').EventEmitter;

var util = require('util');

/**
* @cons
* @param {client} a redis client
* @param {priority:2} a number for set priority level, default 2 mean there have two priority level
* */
var RedisMessageQueue = function(client, name, priority){

if(name === null){
throw new Error('message queue name is null');
}

this.name = name;

priority = priority || 3; //系统默认具有三个优先级的

this.priority = priority < 1 ? 1 : priority; //处理小于等于0的情况

this.__client = client;

this.__queueNames = [];

this.__init();
};

RedisMessageQueue.EVENTS = {
ERROR : 'error'
};

util.inherits(RedisMessageQueue,EventEmitter);


RedisMessageQueue.prototype.__init = function(){
var self = this;
//生成优先级队列名称,*_0,*_1 数字小的优先级高
for(var i = 0 ; i < this.priority; i++){
var messageQueueName = 'message_queue_' + this.name + '_' + i;

self.__queueNames[i] = messageQueueName;
//异步删除
//this.__client.del(messageQueueName);
}

this.__client.on('error',function(err){
self.emit(RedisMessageQueue.EVENTS.ERROR,err);
});

};


RedisMessageQueue.prototype.produce = function(message, level, callback){
var self = this;

if(message == null){
callback && callback(null);
return;
}

var str = null;

var priority = self.__queueNames.length;

//默认写到最低优先级队列里面去
level = level || priority - 1;

level = level < priority ? level : priority - 1;

if(typeof message === 'string'){
str = message;
}else{
try{
str = JSON.stringify(message);
}catch (ex){
callback && callback(ex);
return;
}
}

self.__client.lpush(this.__queueNames[level],str,callback);

};

RedisMessageQueue.prototype.consume = function(cb){

var self = this; var queueNames = self.__queueNames; var time = 0; //表示客户端永远等待 queueNames.push(time); var client = self.__client; client.brpop(queueNames,function(err,res){ if(err){ cb && cb(err); return; } if(result === null){ cb && cb(null,null); return; } var result = res[1]; try{ cb && cb(null, JSON.parse(result)); return; }catch (ex){ if(typeof result === 'string'){ cb && cb(null, result); return; } cb && cb(ex); } });};exports.RedisMessageQueue = RedisMessageQueue;

转载于:https://www.cnblogs.com/inode/p/4384573.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值