@yhiot/utils
Version:
207 lines (166 loc) • 6.28 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _kue = _interopRequireDefault(require("kue"));
var _debug2 = _interopRequireDefault(require("debug"));
var debug = (0, _debug2.default)('app:jobQueue');
/**
* 事务队列,将事务按顺序执行
*/
var JobQueue = function JobQueue(opts) {
var _this = this;
(0, _classCallCheck2.default)(this, JobQueue);
(0, _defineProperty2.default)(this, "defActionFunction", /*#__PURE__*/function () {
var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(job, done) {
var func, result;
return _regenerator.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (!(!job || !job.id)) {
_context.next = 3;
break;
}
debug('error! job should not null!');
return _context.abrupt("return");
case 3:
_context.prev = 3;
func = _this.jobMap[job.id];
if (!func) {
_context.next = 13;
break;
}
_context.next = 8;
return func(job.data);
case 8:
result = _context.sent;
delete _this.jobMap[job.id];
debug("job(job.id) result=".concat(result));
_context.next = 14;
break;
case 13:
debug('warning! not get func of job.id=' + job.id);
case 14:
done();
_context.next = 21;
break;
case 17:
_context.prev = 17;
_context.t0 = _context["catch"](3);
debug('error! queue.process:', _context.t0);
done(_context.t0);
case 21:
case "end":
return _context.stop();
}
}
}, _callee, null, [[3, 17]]);
}));
return function (_x, _x2) {
return _ref.apply(this, arguments);
};
}());
(0, _defineProperty2.default)(this, "defActionFunctionV2", /*#__PURE__*/function () {
var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(job) {
var func, result;
return _regenerator.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
if (!(!job || !job.id)) {
_context2.next = 2;
break;
}
return _context2.abrupt("return", Promise.reject(new Error('error! job & job.id should not null!')));
case 2:
_context2.prev = 2;
func = _this.jobMap[job.id];
if (!func) {
_context2.next = 14;
break;
}
_context2.next = 7;
return func(job.data);
case 7:
result = _context2.sent;
delete _this.jobMap[job.id];
_context2.next = 11;
return Promise.resolve(result);
case 11:
return _context2.abrupt("return", _context2.sent);
case 14:
return _context2.abrupt("return", Promise.reject(new Error('warning! not get func of job.id=' + job.id)));
case 15:
_context2.next = 21;
break;
case 17:
_context2.prev = 17;
_context2.t0 = _context2["catch"](2);
debug('defActionFunctionV2: catch error!', _context2.t0);
return _context2.abrupt("return", Promise.reject(_context2.t0));
case 21:
case "end":
return _context2.stop();
}
}
}, _callee2, null, [[2, 17]]);
}));
return function (_x3) {
return _ref2.apply(this, arguments);
};
}());
(0, _defineProperty2.default)(this, "init", function () {
debug('kue init start');
_this.actionMap = {};
_this.jobMap = {};
_this.queue = _kue.default.createQueue(_this.opts);
_this.queue.on('error', function (err) {
debug('kue error: ', err); // this.init();
});
process.once('SIGTERM', function (sig) {
_this.queue.shutdown(1000, function (err) {
debug("kue shutdown sig-".concat(sig, ": "), err);
});
});
_kue.default.prototype.processAsync = function (name, handler) {
return _this.queue.process(name, function (job, done) {
return handler(job).then(function () {
return done(null);
}).catch(done);
});
};
_this.queue.processAsync(_this.actionName, _this.defActionFunctionV2);
debug('kue init end');
});
(0, _defineProperty2.default)(this, "addJob", function (actionFunc, data) {
return new Promise(function (resolve, reject) {
if (!actionFunc) {
reject(new Error('error! parameter missing! actionFunc=' + actionFunc + ', data=' + data));
}
var msDelay = data && data.delay || 0;
var job = _this.queue.create(_this.actionName, data).delay(msDelay).removeOnComplete(true).save(function (err) {
if (!err) {
debug('create job.id=' + job.id);
_this.jobMap[job.id] = actionFunc;
debug('updated jobMap:', _this.jobMap);
resolve(job);
} else {
debug('error! create fail! data=', data);
reject(err);
}
});
});
});
this.opts = opts; // this.defActionFunction = this.defActionFunction.bind(this);
// this.addJob = this.addJob.bind(this);
this.actionName = 'DEFAULT_ACTION';
this.init();
};
exports.default = JobQueue;