openhim-core
Version:
The OpenHIM core application that provides logging and routing of http requests
163 lines (145 loc) • 4.22 kB
JavaScript
var AutoRetry, Channel, Channels, Q, Task, autoRetryTask, createRerunTask, getChannels, logger, moment, popTransactions, setupAgenda;
logger = require("winston");
moment = require('moment');
Q = require('q');
Channels = require('./model/channels');
Channel = Channels.Channel;
AutoRetry = require('./model/autoRetry').AutoRetry;
Task = require('./model/tasks').Task;
exports.reachedMaxAttempts = function(tx, channel) {
return (channel.autoRetryMaxAttempts != null) && channel.autoRetryMaxAttempts > 0 && tx.autoRetryAttempt >= channel.autoRetryMaxAttempts;
};
exports.queueForRetry = function(tx) {
var retry;
retry = new AutoRetry({
transactionID: tx._id,
channelID: tx.channelID,
requestTimestamp: tx.request.timestamp
});
return retry.save(function(err) {
if (err) {
return logger.error("Failed to queue transaction " + tx._id + " for auto retry: " + err);
}
});
};
getChannels = function(callback) {
return Channel.find({
autoRetryEnabled: true,
status: 'enabled'
}, callback);
};
popTransactions = function(channel, callback) {
var query, to;
to = moment().subtract(channel.autoRetryPeriodMinutes - 1, 'minutes');
query = {
$and: [
{
channelID: channel._id
}, {
'requestTimestamp': {
$lte: to.toDate()
}
}
]
};
logger.debug("Executing query autoRetry.findAndRemove(" + (JSON.stringify(query)) + ")");
return AutoRetry.find(query, function(err, transactions) {
if (err) {
return callback(err);
}
if (transactions.length === 0) {
return callback(null, []);
}
return AutoRetry.remove({
_id: {
$in: transactions.map(function(t) {
return t._id;
})
}
}, function(err) {
if (err) {
return callback(err);
}
return callback(null, transactions);
});
});
};
createRerunTask = function(transactionIDs, callback) {
var task;
logger.info("Rerunning failed transactions: " + transactionIDs);
task = new Task({
transactions: transactionIDs.map(function(t) {
return {
tid: t
};
}),
totalTransactions: transactionIDs.length,
remainingTransactions: transactionIDs.length,
user: 'internal'
});
return task.save(function(err) {
if (err) {
logger.error(err);
}
return callback();
});
};
autoRetryTask = function(job, done) {
var _taskStart, transactionsToRerun;
_taskStart = new Date();
transactionsToRerun = [];
return getChannels(function(err, results) {
var channel, fn, i, len, promises;
promises = [];
fn = function(channel) {
var deferred;
deferred = Q.defer();
popTransactions(channel, function(err, results) {
var j, len1, ref, tid;
if (err) {
logger.error(err);
} else if ((results != null) && results.length > 0) {
ref = results.map(function(r) {
return r.transactionID;
});
for (j = 0, len1 = ref.length; j < len1; j++) {
tid = ref[j];
transactionsToRerun.push(tid);
}
}
return deferred.resolve();
});
return promises.push(deferred.promise);
};
for (i = 0, len = results.length; i < len; i++) {
channel = results[i];
fn(channel);
}
return (Q.all(promises)).then(function() {
var end;
end = function() {
logger.debug("Auto retry task total time: " + (new Date() - _taskStart) + " ms");
return done();
};
if (transactionsToRerun.length > 0) {
return createRerunTask(transactionsToRerun, end);
} else {
return end();
}
});
});
};
setupAgenda = function(agenda) {
agenda.define('auto retry failed transactions', function(job, done) {
return autoRetryTask(job, done);
});
return agenda.every('1 minutes', 'auto retry failed transactions');
};
exports.setupAgenda = setupAgenda;
if (process.env.NODE_ENV === "test") {
exports.getChannels = getChannels;
exports.popTransactions = popTransactions;
exports.createRerunTask = createRerunTask;
exports.autoRetryTask = autoRetryTask;
}
//# sourceMappingURL=autoRetry.js.map