bmqb-mns
Version:
BMQB aliyun mns
170 lines (150 loc) • 4.98 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _aliMns = require('ali-mns');
var _jsonpack = require('jsonpack');
var _jsonpack2 = _interopRequireDefault(_jsonpack);
var _mq_msg = require('../../mq_msg');
var _mq_msg2 = _interopRequireDefault(_mq_msg);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
class MNSAdapter {
constructor(_ref) {
let accountId = _ref.accountId;
let accessKey = _ref.accessKey;
let secretKey = _ref.secretKey;
let queueName = _ref.queueName;
var _ref$region = _ref.region;
let region = _ref$region === undefined ? 'hangzhou' : _ref$region;
if (!accessKey || !secretKey || !accountId) {
throw new Error('invalid arguments');
}
if (!queueName) {
throw new Error('invalid queueName');
}
this.config = {
accountId: accountId,
accessKey: accessKey,
secretKey: secretKey,
queueName: queueName,
region: region
};
}
getAccount() {
if (this.account) {
return this.account;
}
this.account = new _aliMns.Account(this.config.accountId, this.config.accessKey, this.config.secretKey);
return this.account;
}
getQueueHandler() {
if (this.queueHandler) {
return this.queueHandler;
}
this.queueHandler = new _aliMns.MQ(this.config.queueName, this.getAccount(), this.config.region);
return this.queueHandler;
}
/**
* @params msg {MQMsg} 支持字符串、json格式
* @params delay {Integer} 延迟时间(不得大于7天,单位s)
* @params priority {String} 优先级 0-16,默认为8
*/
pushMsg(msg) {
return Promise.resolve().then(() => {
if (!(msg instanceof _mq_msg2.default)) {
throw new Error('msg must be a MQMsg Object!');
}
return this.getQueueHandler().sendP(_jsonpack2.default.pack(msg.getMsg()), msg.getPriority(), msg.getDelay()).then(message => {
msg.setId(message.Message.MessageId);
return msg;
});
});
}
/**
* 每次获取消息后会setTimeout异步调用注册的回调函数
* 所以:一个消息到来后,回调还没被执行完就会紧接着消费下调消息
*/
popMsg(callback) {
return this.getQueueHandler().notifyRecv((err, mnsMsg) => {
if (err) {
callback(err);
}
if (mnsMsg && 'Message' in mnsMsg) {
try {
callback(null, this.generateMQMsg(mnsMsg));
} catch (error) {
callback(error);
}
}
}, 1); // 没有消息时每秒轮询一次
}
/**
* 串行取数据
* callback {Function} 回调函数
* waitSeconds {number} 等待时间
*/
blpopMsg(callback) {
let waitSeconds = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1];
const next = () => {
this.blpopMsg(callback, waitSeconds);
};
return this.getQueueHandler().recvP(waitSeconds).then(mnsMsg => {
if (mnsMsg && mnsMsg.Message) {
return callback(null, this.generateMQMsg(mnsMsg), next);
}
throw new Error('Invalid mns msg object');
}).catch(err => {
if (err && err.Error && err.Error.Code === 'MessageNotExist') {
return next();
}
return callback(err, null, next);
});
}
generateMQMsg(mnsMsg) {
let msgMeta = mnsMsg.Message.MessageBody;
msgMeta = _jsonpack2.default.unpack(msgMeta);
const mqMsg = new _mq_msg2.default(msgMeta);
mqMsg.setId(mnsMsg.Message.MessageId);
mqMsg.setRawMsg(mnsMsg.Message);
mqMsg.setEnqueueTime(mnsMsg.Message.EnqueueTime);
mqMsg.setNextVisibleTime(mnsMsg.Message.NextVisibleTime);
return mqMsg;
}
/**
* @params msg {MQMsg}
*/
deleteMsg(msg) {
return Promise.resolve().then(() => {
if (!msg || !(msg instanceof _mq_msg2.default)) {
throw new Error('msg must be a MQMsg Object!');
}
const rawMsg = msg.getRawMsg();
if (!rawMsg.ReceiptHandle) {
throw new Error('The msg object have no attribute about ReceiptHandle');
}
return this.getQueueHandler().deleteP(rawMsg.ReceiptHandle);
});
}
/**
* 设置消息可见性
* @param {MQMsg} msg - 消息
* @param {number} seconds - 消息可见秒数
*/
setMsgVisibility(msg) {
let seconds = arguments.length <= 1 || arguments[1] === undefined ? 1 : arguments[1];
return Promise.resolve().then(() => {
if (!msg || !(msg instanceof _mq_msg2.default)) {
throw new Error('msg must be a MQMsg Object!');
}
if (!(seconds >= 1 && seconds <= 43200)) {
throw new Error('msg visibility seconds must between 1 and 43200!');
}
const rawMsg = msg.getRawMsg();
if (!rawMsg.ReceiptHandle) {
throw new Error('The msg object have no attribute about ReceiptHandle');
}
return this.getQueueHandler().reserveP(rawMsg.ReceiptHandle, seconds);
});
}
}
exports.default = MNSAdapter;