forked from CITKParus/P8-ExchangeService
Переход от временной модели передачи контекста через сообщения обработчиков к полноценной поддержки аутентификации и хранения контекста работы сервиса в БД
This commit is contained in:
parent
d92d85f4f6
commit
01a3e88e6b
@ -15,6 +15,7 @@ exports.SMODULES_PATH_MODELS = "@models"; //Модели данных и схе
|
||||
//Типовые коды ошибок
|
||||
exports.SERR_COMMON = "ERR_COMMON"; //Общая ошибка
|
||||
exports.SERR_UNEXPECTED = "ERR_UNEXPECTED"; //Неожиданная ошибка
|
||||
exports.SERR_UNAUTH = "ERR_UNAUTH"; //Отсутствие аутентификации
|
||||
|
||||
//Типовые коды ошибок подключения модулей
|
||||
exports.SERR_MODULES_NO_MODULE_SPECIFIED = "ERR_MODULES_NO_MODULE_SPECIFIED"; //Не указан подключаемый модуль
|
||||
|
@ -195,6 +195,9 @@ class OutQueue extends EventEmitter {
|
||||
const self = this;
|
||||
//Запоминаем текущее количество попыток обработки
|
||||
const nQueueOldExecCnt = prms.queue.nExecCnt;
|
||||
//Буфер для ошибок (для журнала работы и очереди обмена)
|
||||
let sErrorLog = null;
|
||||
let sError = null;
|
||||
//Создаём новый обработчик сообщений
|
||||
const proc = ChildProcess.fork("core/out_queue_processor", { silent: false });
|
||||
//Перехват сообщений обработчика
|
||||
@ -211,40 +214,30 @@ class OutQueue extends EventEmitter {
|
||||
if (!sCheckResult) {
|
||||
//Анализируем результат обработки - если ошибка - фиксируем
|
||||
if (result.sResult == objOutQueueProcessorSchema.STASK_RESULT_ERR) {
|
||||
//Фиксируем ошибку обработки - протокол работы сервиса
|
||||
await self.logger.error(`Ошибка обработки исходящего сообщения: ${result.sMsg}`, {
|
||||
nQueueId: prms.queue.nId
|
||||
});
|
||||
//Фиксируем ошибку обработки - статус сообщения
|
||||
await this.dbConn.setQueueState({
|
||||
nQueueId: prms.queue.nId,
|
||||
sExecMsg: result.sMsg,
|
||||
nIncExecCnt:
|
||||
nQueueOldExecCnt == prms.queue.nExecCnt ? NINC_EXEC_CNT_YES : NINC_EXEC_CNT_NO,
|
||||
nExecState:
|
||||
(nQueueOldExecCnt == prms.queue.nExecCnt
|
||||
? prms.queue.nExecCnt + 1
|
||||
: prms.queue.nExecCnt) < prms.queue.nRetryAttempts
|
||||
? prms.queue.nExecState
|
||||
: objQueueSchema.NQUEUE_EXEC_STATE_ERR
|
||||
});
|
||||
//Запоминаем ошибку обработчика
|
||||
sErrorLog = `Ошибка обработки исходящего сообщения: ${result.sMsg}`;
|
||||
sError = result.sMsg;
|
||||
} else {
|
||||
//Ошибки нет, но если есть контекст для сервиса - сохраним его для дальнейшего использования
|
||||
if (!_.isUndefined(result.context)) {
|
||||
let tmpSrv = _.find(this.services, { nId: prms.queue.nServiceId });
|
||||
tmpSrv.context = _.cloneDeep(result.context);
|
||||
//Ошибки обработки нет, но может быть есть ошибка аутентификации
|
||||
if (result.sResult == objOutQueueProcessorSchema.STASK_RESULT_UNAUTH) {
|
||||
//!!!!!!!!!!!!!!
|
||||
//??????????????
|
||||
//!!!!!!!!!!!!!!
|
||||
}
|
||||
}
|
||||
} else {
|
||||
//Пришел неожиданный ответ обработчика - запись в протокол работы сервиса
|
||||
await self.logger.error(
|
||||
`Неожиданный ответ обработчика для сообщения ${prms.queue.nId}: ${sCheckResult}`,
|
||||
{ nQueueId: prms.queue.nId }
|
||||
);
|
||||
//Фиксируем ошибку обработки - статус сообщения
|
||||
//Пришел неожиданный ответ обработчика
|
||||
sErrorLog = `Неожиданный ответ обработчика для сообщения ${prms.queue.nId}: ${sCheckResult}`;
|
||||
sError = sCheckResult;
|
||||
}
|
||||
//Фиксируем ошибки, если есть
|
||||
if (sError) {
|
||||
//Запись в протокол работы сервиса
|
||||
await self.logger.error(sErrorLog, { nQueueId: prms.queue.nId });
|
||||
//Запись в статус сообщения
|
||||
await this.dbConn.setQueueState({
|
||||
nQueueId: prms.queue.nId,
|
||||
sExecMsg: `Неожиданный ответ обработчика для сообщения ${prms.queue.nId}: ${sCheckResult}`,
|
||||
sExecMsg: sError,
|
||||
nIncExecCnt: nQueueOldExecCnt == prms.queue.nExecCnt ? NINC_EXEC_CNT_YES : NINC_EXEC_CNT_NO,
|
||||
nExecState:
|
||||
(nQueueOldExecCnt == prms.queue.nExecCnt
|
||||
|
@ -17,8 +17,14 @@ const { ServerError } = require("./server_errors"); //Типовая ошибк
|
||||
const objOutQueueProcessorSchema = require("../models/obj_out_queue_processor"); //Схема валидации сообщений обмена с бработчиком очереди исходящих сообщений
|
||||
const prmsOutQueueProcessorSchema = require("../models/prms_out_queue_processor"); //Схема валидации параметров функций модуля
|
||||
const objQueueSchema = require("../models/obj_queue"); //Схемы валидации сообщения очереди
|
||||
const objServiceSchema = require("../models/obj_service"); //Схемы валидации сервиса
|
||||
const objServiceFnSchema = require("../models/obj_service_function"); //Схемы валидации функции сервиса
|
||||
const { SERR_OBJECT_BAD_INTERFACE, SERR_APP_SERVER_BEFORE, SERR_APP_SERVER_AFTER } = require("./constants"); //Глобальные константы
|
||||
const {
|
||||
SERR_OBJECT_BAD_INTERFACE,
|
||||
SERR_APP_SERVER_BEFORE,
|
||||
SERR_APP_SERVER_AFTER,
|
||||
SERR_UNAUTH
|
||||
} = require("./constants"); //Глобальные константы
|
||||
const { NINC_EXEC_CNT_YES, NINC_EXEC_CNT_NO } = require("../models/prms_db_connector"); //Схемы валидации параметров функций модуля взаимодействия с БД
|
||||
|
||||
//--------------------------
|
||||
@ -44,40 +50,36 @@ const sendErrorResult = prms => {
|
||||
if (!sCheckResult) {
|
||||
process.send({
|
||||
sResult: objOutQueueProcessorSchema.STASK_RESULT_ERR,
|
||||
sMsg: prms.sMessage,
|
||||
context: null
|
||||
sMsg: prms.sMessage
|
||||
});
|
||||
} else {
|
||||
process.send({
|
||||
sResult: objOutQueueProcessorSchema.STASK_RESULT_ERR,
|
||||
sMsg: sCheckResult,
|
||||
context: null
|
||||
sMsg: sCheckResult
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
//Отправка родительскому процессу успеха обработки сообщения сервером приложений
|
||||
const sendOKResult = prms => {
|
||||
//Проверяем структуру переданного сообщения
|
||||
let sCheckResult = validateObject(
|
||||
prms,
|
||||
prmsOutQueueProcessorSchema.sendOKResult,
|
||||
"Параметры функции отправки родительскому процессу успеха обработки сообщения"
|
||||
);
|
||||
//Если структура объекта в норме
|
||||
if (!sCheckResult) {
|
||||
const sendOKResult = () => {
|
||||
process.send({
|
||||
sResult: objOutQueueProcessorSchema.STASK_RESULT_OK,
|
||||
sMsg: null,
|
||||
context: prms.context
|
||||
sMsg: null
|
||||
});
|
||||
};
|
||||
|
||||
//Отправка родительскому процессу успеха обработки сообщения сервером приложений
|
||||
const sendUnAuthResult = () => {
|
||||
process.send({
|
||||
sResult: objOutQueueProcessorSchema.STASK_RESULT_UNAUTH,
|
||||
sMsg: null
|
||||
});
|
||||
} else {
|
||||
sendErrorResult({ sMessage: sCheckResult });
|
||||
}
|
||||
};
|
||||
|
||||
//Запуск обработки сообщения сервером приложений
|
||||
const appProcess = async prms => {
|
||||
//Результат обработки - объект Queue (обработанное сообщение) или ServerError (ошибка обработки)
|
||||
let res = null;
|
||||
//Проверяем структуру переданного объекта для старта
|
||||
let sCheckResult = validateObject(
|
||||
prms,
|
||||
@ -86,16 +88,22 @@ const appProcess = async prms => {
|
||||
);
|
||||
//Если структура объекта в норме
|
||||
if (!sCheckResult) {
|
||||
//Обработанное сообщение
|
||||
let newQueue = null;
|
||||
//Обрабатываем
|
||||
try {
|
||||
//Считываем статус аутентификации сервиса
|
||||
let isServiceAuth = await dbConn.isServiceAuth({ nServiceId: prms.service.nId });
|
||||
//Проверяем аутентификацию
|
||||
if (
|
||||
prms.function.nAuthOnly == objServiceFnSchema.NAUTH_ONLY_NO ||
|
||||
(prms.function.nAuthOnly == objServiceFnSchema.NAUTH_ONLY_YES &&
|
||||
isServiceAuth == objServiceSchema.NIS_AUTH_YES)
|
||||
) {
|
||||
//Фиксируем начало исполнения сервером приложений - в статусе сообщения
|
||||
newQueue = await dbConn.setQueueState({
|
||||
res = await dbConn.setQueueState({
|
||||
nQueueId: prms.queue.nId,
|
||||
nExecState: objQueueSchema.NQUEUE_EXEC_STATE_APP
|
||||
});
|
||||
//Скажем что начали обработку
|
||||
//Фиксируем начало исполнения сервером приложений - в протоколе работы сервиса
|
||||
await logger.info(
|
||||
`Обрабатываю исходящее сообщение сервером приложений: ${prms.queue.nId}, ${prms.queue.sInDate}, ${
|
||||
prms.queue.sServiceFnCode
|
||||
@ -104,8 +112,12 @@ const appProcess = async prms => {
|
||||
);
|
||||
//Считаем тело сообщения
|
||||
let qData = await dbConn.getQueueMsg({ nQueueId: prms.queue.nId });
|
||||
//Считаем контекст сервиса
|
||||
let serviceCtx = await dbConn.getServiceContext({ nServiceId: prms.service.nId });
|
||||
//Кладём данные тела в объект сообщения и инициализируем поле для ответа
|
||||
_.extend(prms.queue, { blMsg: qData.blMsg, blResp: null });
|
||||
//Кладём данные контекста в сервис
|
||||
_.extend(prms.service, serviceCtx);
|
||||
//Собираем параметры для передачи серверу
|
||||
let options = { method: prms.service.sFnPrmsType };
|
||||
//Определимся с URL и телом сообщения в зависимости от способа передачи параметров
|
||||
@ -139,7 +151,6 @@ const appProcess = async prms => {
|
||||
//Если структура ответа в норме
|
||||
if (!sCheckResult) {
|
||||
//Применим её
|
||||
if (!_.isUndefined(resBefore.options)) options = _.cloneDeep(resBefore.options);
|
||||
if (!_.isUndefined(resBefore.blMsg)) {
|
||||
prms.queue.blMsg = resBefore.blMsg;
|
||||
await dbConn.setQueueMsg({
|
||||
@ -156,9 +167,11 @@ const appProcess = async prms => {
|
||||
});
|
||||
}
|
||||
}
|
||||
if (!_.isUndefined(resBefore.context)) prms.service.context = _.cloneDeep(resBefore.context);
|
||||
if (!_.isUndefined(resBefore.options)) options = _.cloneDeep(resBefore.options);
|
||||
if (!_.isUndefined(resBefore.bUnAuth))
|
||||
throw new ServerError(SERR_UNAUTH, "Не аутентифицирован");
|
||||
} else {
|
||||
//Или расскажем об ошибке
|
||||
//Или расскажем об ошибке в структуре ответа
|
||||
throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
|
||||
}
|
||||
}
|
||||
@ -170,10 +183,10 @@ const appProcess = async prms => {
|
||||
//Отправляем сообщение удалённому серверу
|
||||
let serverResp = await rqp(options);
|
||||
//Сохраняем полученный ответ
|
||||
_.extend(prms, { serverResp });
|
||||
prms.queue.blResp = new Buffer(serverResp);
|
||||
await dbConn.setQueueResp({
|
||||
nQueueId: prms.queue.nId,
|
||||
blResp: new Buffer(prms.serverResp)
|
||||
blResp: prms.queue.blResp
|
||||
});
|
||||
//Выполняем обработчик "После" (если он есть)
|
||||
if (prms.function.sAppSrvAfter) {
|
||||
@ -195,26 +208,23 @@ const appProcess = async prms => {
|
||||
//Если структура ответа в норме
|
||||
if (!sCheckResult) {
|
||||
//Применим её
|
||||
if (!_.isUndefined(resAfter.blResp)) prms.queue.blResp = resAfter.blResp;
|
||||
if (!_.isUndefined(resAfter.context)) prms.service.context = _.cloneDeep(resAfter.context);
|
||||
} else {
|
||||
//Или расскажем об ошибке
|
||||
throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
|
||||
}
|
||||
} else {
|
||||
prms.queue.blResp = new Buffer(serverResp.toString());
|
||||
}
|
||||
} else {
|
||||
prms.queue.blResp = new Buffer(serverResp.toString());
|
||||
}
|
||||
//Фиксируем успех исполнения
|
||||
newQueue = await dbConn.setQueueAppSrvResult({
|
||||
if (!_.isUndefined(resAfter.blResp)) {
|
||||
prms.queue.blResp = resAfter.blResp;
|
||||
await dbConn.setQueueResp({
|
||||
nQueueId: prms.queue.nId,
|
||||
blMsg: prms.queue.blMsg,
|
||||
blResp: prms.queue.blResp
|
||||
});
|
||||
}
|
||||
if (!_.isUndefined(resAfter.bUnAuth))
|
||||
throw new ServerError(SERR_UNAUTH, "Не аутентифицирован");
|
||||
} else {
|
||||
//Или расскажем об ошибке в структуре ответа
|
||||
throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
|
||||
}
|
||||
}
|
||||
}
|
||||
//Фиксируем успешное исполнение сервером приложений - в статусе сообщения
|
||||
newQueue = await dbConn.setQueueState({
|
||||
res = await dbConn.setQueueState({
|
||||
nQueueId: prms.queue.nId,
|
||||
nExecState: objQueueSchema.NQUEUE_EXEC_STATE_APP_OK
|
||||
});
|
||||
@ -222,9 +232,13 @@ const appProcess = async prms => {
|
||||
await logger.info(`Исходящее сообщение ${prms.queue.nId} успешно отработано сервером приложений`, {
|
||||
nQueueId: prms.queue.nId
|
||||
});
|
||||
} else {
|
||||
//Нет атуентификации (мы ещё не меняли статус сообщения и это не считается за попытку исполнения, это будет просто сигнал, что надо аутентифицироваться а потом задача снова попадёт в очередь)
|
||||
res = new ServerError(SERR_UNAUTH, "Не аутентифицирован");
|
||||
}
|
||||
} catch (e) {
|
||||
//Фиксируем ошибку обработки сервером приложений - в статусе сообщения
|
||||
newQueue = await dbConn.setQueueState({
|
||||
res = await dbConn.setQueueState({
|
||||
nQueueId: prms.queue.nId,
|
||||
sExecMsg: makeErrorText(e),
|
||||
nIncExecCnt: NINC_EXEC_CNT_YES,
|
||||
@ -239,15 +253,18 @@ const appProcess = async prms => {
|
||||
{ nQueueId: prms.queue.nId }
|
||||
);
|
||||
}
|
||||
//Возвращаем результат
|
||||
return newQueue;
|
||||
} else {
|
||||
throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
|
||||
//Фатальная ошибка обработки - некорректный объект параметров
|
||||
res = new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
|
||||
}
|
||||
//Возвращаем результат
|
||||
return res;
|
||||
};
|
||||
|
||||
//Запуск обработки сообщения сервером БД
|
||||
const dbProcess = async prms => {
|
||||
//Результат обработки - объект Queue (обработанное сообщение) или ServerError (ошибка обработки)
|
||||
let res = null;
|
||||
//Проверяем структуру переданного объекта для старта
|
||||
let sCheckResult = validateObject(
|
||||
prms,
|
||||
@ -259,11 +276,11 @@ const dbProcess = async prms => {
|
||||
//Обрабатываем
|
||||
try {
|
||||
//Фиксируем начало исполнения сервером БД - в статусе сообщения
|
||||
await dbConn.setQueueState({
|
||||
res = await dbConn.setQueueState({
|
||||
nQueueId: prms.queue.nId,
|
||||
nExecState: objQueueSchema.NQUEUE_EXEC_STATE_DB
|
||||
});
|
||||
//Скажем что начали обработку
|
||||
//Фиксируем начало исполнения сервером БД - в протоколе работы сервиса
|
||||
await logger.info(
|
||||
`Обрабатываю исходящее сообщение сервером БД: ${prms.queue.nId}, ${prms.queue.sInDate}, ${
|
||||
prms.queue.sServiceFnCode
|
||||
@ -271,9 +288,9 @@ const dbProcess = async prms => {
|
||||
{ nQueueId: prms.queue.nId }
|
||||
);
|
||||
//Вызов обработчика БД
|
||||
await dbConn.execQueueDBPrc({ nQueueId: prms.queue.nId });
|
||||
//Фиксируем успешное исполнение сервером БД - в статусе сообщения
|
||||
await dbConn.setQueueState({
|
||||
res = await dbConn.execQueueDBPrc({ nQueueId: prms.queue.nId });
|
||||
//Фиксируем успешное исполнение (полное - дальше обработки нет) - в статусе сообщения
|
||||
res = await dbConn.setQueueState({
|
||||
nQueueId: prms.queue.nId,
|
||||
nIncExecCnt: prms.queue.nExecCnt == 0 ? NINC_EXEC_CNT_YES : NINC_EXEC_CNT_NO,
|
||||
nExecState: objQueueSchema.NQUEUE_EXEC_STATE_OK
|
||||
@ -300,8 +317,11 @@ const dbProcess = async prms => {
|
||||
);
|
||||
}
|
||||
} else {
|
||||
throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
|
||||
//Фатальная ошибка обработки - некорректный объект параметров
|
||||
res = new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
|
||||
}
|
||||
//Возвращаем результат
|
||||
return res;
|
||||
};
|
||||
|
||||
//Обработка задачи
|
||||
@ -331,12 +351,15 @@ const processTask = async prms => {
|
||||
await dbConn.connect();
|
||||
//Считываем запись очереди
|
||||
q = await dbConn.getQueue({ nQueueId: prms.task.nQueueId });
|
||||
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Проверяем аутентификацию
|
||||
//if(prms.task.function.)
|
||||
//Выставим флаг - нет ошибок аутентификации на удаленном сервере
|
||||
let bUnAuthFlag = false;
|
||||
//Далее работаем от статуса считанной записи
|
||||
switch (q.nExecState) {
|
||||
//Поставлено в очередь
|
||||
case objQueueSchema.NQUEUE_EXEC_STATE_INQUEUE: {
|
||||
//Статусы "Поставлено в очередь" или "Ошибка обработки сервером приложений"
|
||||
case objQueueSchema.NQUEUE_EXEC_STATE_INQUEUE:
|
||||
case objQueueSchema.NQUEUE_EXEC_STATE_APP_ERR: {
|
||||
//Если ещё не обрабатывали или есть ещё попытки отработки
|
||||
if (q.nExecCnt == 0 || q.nExecCnt < q.nRetryAttempts) {
|
||||
//Запускаем обработку сервером приложений
|
||||
try {
|
||||
let res = await appProcess({
|
||||
@ -344,7 +367,12 @@ const processTask = async prms => {
|
||||
service: prms.task.service,
|
||||
function: prms.task.function
|
||||
});
|
||||
//И если она успешно завершилась - обработку сервером БД
|
||||
//Если результат обработки - ошибка аутентификации
|
||||
if (res === objOutQueueProcessorSchema.STASK_RESULT_UNAUTH) {
|
||||
//Выставим флаг, который будет указывать на ошибку аутентификации
|
||||
bUnAuthFlag = true;
|
||||
} else {
|
||||
//Нет такой ошибки, посмотрим что прилетело сообщение в успешном статусе и тогда запустим обработку сервером БД
|
||||
if (res.nExecState == objQueueSchema.NQUEUE_EXEC_STATE_APP_OK) {
|
||||
try {
|
||||
await dbProcess({ queue: res });
|
||||
@ -361,72 +389,13 @@ const processTask = async prms => {
|
||||
});
|
||||
//Фиксируем ошибку обработки сервером БД - в протоколе работы сервиса
|
||||
await logger.error(
|
||||
`Ошибка обработки исходящего сообщения ${res.nId} сервером БД: ${makeErrorText(e)}`,
|
||||
`Ошибка обработки исходящего сообщения ${
|
||||
res.nId
|
||||
} сервером БД: ${makeErrorText(e)}`,
|
||||
{ nQueueId: res.nId }
|
||||
);
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
//Фиксируем ошибку обработки сервером приложений - в статусе сообщения
|
||||
newQueue = await dbConn.setQueueState({
|
||||
nQueueId: q.nId,
|
||||
sExecMsg: makeErrorText(e),
|
||||
nIncExecCnt: NINC_EXEC_CNT_YES,
|
||||
nExecState:
|
||||
q.nExecCnt + 1 < q.nRetryAttempts
|
||||
? objQueueSchema.NQUEUE_EXEC_STATE_APP_ERR
|
||||
: objQueueSchema.NQUEUE_EXEC_STATE_ERR
|
||||
});
|
||||
//Фиксируем ошибку обработки сервером приложений - в протоколе работы сервиса
|
||||
await logger.error(
|
||||
`Ошибка обработки исходящего сообщения ${q.nId} сервером приложений: ${makeErrorText(e)}`,
|
||||
{ nQueueId: q.nId }
|
||||
);
|
||||
}
|
||||
break;
|
||||
}
|
||||
//Обрабатывается сервером приложений
|
||||
case objQueueSchema.NQUEUE_EXEC_STATE_APP: {
|
||||
//Предупредим о неверном статусе сообщения (такие сюда попадать не должны)
|
||||
await logger.warn(`Cообщение ${q.nId} в статусе ${q.sExecState} попало в очередь обработчика`, {
|
||||
nQueueId: q.nId
|
||||
});
|
||||
break;
|
||||
}
|
||||
//Ошибка обработки сервером приложений
|
||||
case objQueueSchema.NQUEUE_EXEC_STATE_APP_ERR: {
|
||||
//Если ещё есть попытки отработки
|
||||
if (q.nExecCnt < q.nRetryAttempts) {
|
||||
//Снова запускаем обработку сервером приложений
|
||||
try {
|
||||
let res = await appProcess({
|
||||
queue: q,
|
||||
service: prms.task.service,
|
||||
function: prms.task.function
|
||||
});
|
||||
//И если она успешно завершилась - обработку сервоером БД
|
||||
if (res.nExecState == objQueueSchema.NQUEUE_EXEC_STATE_APP_OK) {
|
||||
try {
|
||||
await dbProcess({ queue: res });
|
||||
} catch (e) {
|
||||
//Фиксируем ошибку обработки сервером БД - в статусе сообщения
|
||||
await dbConn.setQueueState({
|
||||
nQueueId: res.nId,
|
||||
sExecMsg: makeErrorText(e),
|
||||
nIncExecCnt: NINC_EXEC_CNT_YES,
|
||||
nExecState:
|
||||
res.nExecCnt + 1 < res.nRetryAttempts
|
||||
? objQueueSchema.NQUEUE_EXEC_STATE_DB_ERR
|
||||
: objQueueSchema.NQUEUE_EXEC_STATE_ERR
|
||||
});
|
||||
//Фиксируем ошибку обработки сервером БД - в протоколе работы сервиса
|
||||
await logger.error(
|
||||
`Ошибка обработки исходящего сообщения ${res.nId} сервером БД: ${makeErrorText(
|
||||
e
|
||||
)}`,
|
||||
{ nQueueId: res.nId }
|
||||
);
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
//Фиксируем ошибку обработки сервером приложений - в статусе сообщения
|
||||
@ -458,42 +427,11 @@ const processTask = async prms => {
|
||||
}
|
||||
break;
|
||||
}
|
||||
//Успешно обработано сервером приложений
|
||||
case objQueueSchema.NQUEUE_EXEC_STATE_APP_OK: {
|
||||
//Запускаем обработку в БД
|
||||
try {
|
||||
await dbProcess({ queue: q });
|
||||
} catch (e) {
|
||||
//Фиксируем ошибку обработки сервером БД - в статусе сообщения
|
||||
await dbConn.setQueueState({
|
||||
nQueueId: q.nId,
|
||||
sExecMsg: makeErrorText(e),
|
||||
nIncExecCnt: NINC_EXEC_CNT_YES,
|
||||
nExecState:
|
||||
q.nExecCnt + 1 < q.nRetryAttempts
|
||||
? objQueueSchema.NQUEUE_EXEC_STATE_DB_ERR
|
||||
: objQueueSchema.NQUEUE_EXEC_STATE_ERR
|
||||
});
|
||||
//Фиксируем ошибку обработки сервером БД - в протоколе работы сервиса
|
||||
await logger.error(
|
||||
`Ошибка обработки исходящего сообщения ${q.nId} сервером БД: ${makeErrorText(e)}`,
|
||||
{ nQueueId: q.nId }
|
||||
);
|
||||
}
|
||||
break;
|
||||
}
|
||||
//Обрабатывается в БД
|
||||
case objQueueSchema.NQUEUE_EXEC_STATE_DB: {
|
||||
//Предупредим о неверном статусе сообщения (такие сюда попадать не должны)
|
||||
await logger.warn(`Cообщение ${q.nId} в статусе ${q.sExecState} попало в очередь обработчика`, {
|
||||
nQueueId: q.nId
|
||||
});
|
||||
break;
|
||||
}
|
||||
//Ошибка обработки в БД
|
||||
//Статусы "Успешно обработано сервером приложений" и "Ошибка обработки в БД"
|
||||
case objQueueSchema.NQUEUE_EXEC_STATE_APP_OK:
|
||||
case objQueueSchema.NQUEUE_EXEC_STATE_DB_ERR: {
|
||||
//Если ещё есть попытки отработки
|
||||
if (q.nExecCnt < q.nRetryAttempts) {
|
||||
if (q.nExecCnt == 0 || q.nExecCnt < q.nRetryAttempts) {
|
||||
//Снова запускаем обработку сервером БД
|
||||
try {
|
||||
await dbProcess({ queue: q });
|
||||
@ -536,15 +474,10 @@ const processTask = async prms => {
|
||||
});
|
||||
break;
|
||||
}
|
||||
//Обработано с ошибками
|
||||
case objQueueSchema.NQUEUE_EXEC_STATE_ERR: {
|
||||
//Предупредим о неверном статусе сообщения (такие сюда попадать не должны)
|
||||
await logger.warn(`Cообщение ${q.nId} в статусе ${q.sExecState} попало в очередь обработчика`, {
|
||||
nQueueId: q.nId
|
||||
});
|
||||
break;
|
||||
}
|
||||
//Обработано успешно
|
||||
//Статусы "Обрабатывается сервером приложений", "Обрабатывается в БД", "Обработано с ошибками", "Обработано успешно"
|
||||
case objQueueSchema.NQUEUE_EXEC_STATE_APP:
|
||||
case objQueueSchema.NQUEUE_EXEC_STATE_DB:
|
||||
case objQueueSchema.NQUEUE_EXEC_STATE_ERR:
|
||||
case objQueueSchema.NQUEUE_EXEC_STATE_OK: {
|
||||
//Предупредим о неверном статусе сообщения (такие сюда попадать не должны)
|
||||
await logger.warn(`Cообщение ${q.nId} в статусе ${q.sExecState} попало в очередь обработчика`, {
|
||||
@ -552,6 +485,7 @@ const processTask = async prms => {
|
||||
});
|
||||
break;
|
||||
}
|
||||
//Неипонятный статус
|
||||
default: {
|
||||
//Ничего не делаем
|
||||
break;
|
||||
@ -559,8 +493,9 @@ const processTask = async prms => {
|
||||
}
|
||||
//Отключаемся от БД
|
||||
if (dbConn) await dbConn.disconnect();
|
||||
//Отправляем успех
|
||||
sendOKResult({ context: prms.task.service.context });
|
||||
//Отправляем успех или ошибку аутентификации
|
||||
if (bUnAuthFlag) sendUnAuthResult();
|
||||
else sendOKResult();
|
||||
} catch (e) {
|
||||
//Отключаемся от БД
|
||||
if (dbConn) await dbConn.disconnect();
|
||||
|
@ -19,6 +19,7 @@ const { ServiceFunction } = require("./obj_service_function"); //Схема ва
|
||||
//Состояния обработки сообщений очереди обмена
|
||||
const STASK_RESULT_OK = "OK"; //Обработано успешно
|
||||
const STASK_RESULT_ERR = "ERR"; //Обработано с ошибками
|
||||
const STASK_RESULT_UNAUTH = "UNAUTH"; //Не обработано из-за отсутсвия аутентификации
|
||||
|
||||
//------------------
|
||||
// Интерфейс модуля
|
||||
@ -27,6 +28,7 @@ const STASK_RESULT_ERR = "ERR"; //Обработано с ошибками
|
||||
//Константы
|
||||
exports.STASK_RESULT_OK = STASK_RESULT_OK;
|
||||
exports.STASK_RESULT_ERR = STASK_RESULT_ERR;
|
||||
exports.STASK_RESULT_UNAUTH = STASK_RESULT_UNAUTH;
|
||||
|
||||
//Схема валидации задачи обработчику очереди исходящих сообщений
|
||||
exports.OutQueueProcessorTask = new Schema({
|
||||
@ -71,7 +73,7 @@ exports.OutQueueProcessorTaskResult = new Schema({
|
||||
//Состояние обработки сообщения очереди обмена
|
||||
sResult: {
|
||||
type: String,
|
||||
enum: [STASK_RESULT_OK, STASK_RESULT_ERR],
|
||||
enum: [STASK_RESULT_OK, STASK_RESULT_ERR, STASK_RESULT_UNAUTH],
|
||||
required: true,
|
||||
message: {
|
||||
type: path =>
|
||||
@ -89,15 +91,6 @@ exports.OutQueueProcessorTaskResult = new Schema({
|
||||
`Информация от обработчика сообщения очереди обмена (${path}) имеет некорректный тип данных (ожидалось - String)`,
|
||||
required: path => `Не указана информация от обработчика сообщения очереди обмена (${path})`
|
||||
}
|
||||
},
|
||||
//Контекст работы сервиса
|
||||
context: {
|
||||
type: Object,
|
||||
required: true,
|
||||
message: {
|
||||
type: path => `Контекст работы сервиса (${path}) имеет некорректный тип данных (ожидалось - Object)`,
|
||||
required: path => `Не указан контекст работы сервиса (${path})`
|
||||
}
|
||||
}
|
||||
}).validator({
|
||||
required: val => typeof val != "undefined"
|
||||
@ -125,13 +118,14 @@ exports.OutQueueProcessorFnBefore = new Schema({
|
||||
required: path => `Не указано обработанное сообщение очереди (${path})`
|
||||
}
|
||||
},
|
||||
//Контекст работы сервиса
|
||||
context: {
|
||||
type: Object,
|
||||
//Флаг ошибки аутентификации на удаленном сервисе
|
||||
bUnAuth: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
message: {
|
||||
type: path => `Контекст работы сервиса (${path}) имеет некорректный тип данных (ожидалось - Object)`,
|
||||
required: path => `Не указан контекст работы сервиса (${path})`
|
||||
type: path =>
|
||||
`Флаг ошибки аутентификации на удаленном сервисе (${path}) имеет некорректный тип данных (ожидалось - Boolean)`,
|
||||
required: path => `Не указан флаг ошибки аутентификации на удаленном сервисе (${path})`
|
||||
}
|
||||
}
|
||||
});
|
||||
@ -148,13 +142,14 @@ exports.OutQueueProcessorFnAfter = new Schema({
|
||||
required: path => `Не указан результат обработки ответа удалённого сервиса (${path})`
|
||||
}
|
||||
},
|
||||
//Контекст работы сервиса
|
||||
context: {
|
||||
type: Object,
|
||||
//Флаг ошибки аутентификации на удаленном сервисе
|
||||
bUnAuth: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
message: {
|
||||
type: path => `Контекст работы сервиса (${path}) имеет некорректный тип данных (ожидалось - Object)`,
|
||||
required: path => `Не указан контекст работы сервиса (${path})`
|
||||
type: path =>
|
||||
`Флаг ошибки аутентификации на удаленном сервисе (${path}) имеет некорректный тип данных (ожидалось - Boolean)`,
|
||||
required: path => `Не указан флаг ошибки аутентификации на удаленном сервисе (${path})`
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -24,21 +24,8 @@ exports.sendErrorResult = new Schema({
|
||||
type: String,
|
||||
required: true,
|
||||
message: {
|
||||
type: path => `Идентификатор сервиса (${path}) имеет некорректный тип данных (ожидалось - String)`,
|
||||
required: path => `Не указан идентификатор сервиса (${path})`
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
//Схема валидации параметров функции отправки успеха обработки
|
||||
exports.sendOKResult = new Schema({
|
||||
//Контекст работы сервиса
|
||||
context: {
|
||||
type: Object,
|
||||
required: true,
|
||||
message: {
|
||||
type: path => `Контекст работы сервиса (${path}) имеет некорректный тип данных (ожидалось - Object)`,
|
||||
required: path => `Не указан контекст работы сервиса (${path})`
|
||||
type: path => `Сообщение об ошибке (${path}) имеет некорректный тип данных (ожидалось - String)`,
|
||||
required: path => `Не указано сообщение об ошибке (${path})`
|
||||
}
|
||||
}
|
||||
});
|
||||
|
Loading…
x
Reference in New Issue
Block a user