UNPKG

bmqb-mns

Version:
170 lines (150 loc) 4.98 kB
'use strict'; 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;