From af5f93380fc634e249511321f79184e80af960c6 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Sun, 6 Jan 2019 20:31:36 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B1=D1=80=D0=BE=D1=81=20?= =?UTF-8?q?=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20=D0=BE=D0=B1=20=D0=BE?= =?UTF-8?q?=D1=82=D1=81=D1=83=D1=82=D1=81=D1=82=D0=B2=D0=B8=D0=B8=20=D0=B0?= =?UTF-8?q?=D1=83=D1=82=D0=B5=D0=BD=D1=82=D0=B8=D1=84=D0=B8=D0=BA=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20=D0=B3=D0=BE=D0=BB=D0=BE=D0=B2=D0=BD=D0=BE?= =?UTF-8?q?=D0=BC=D1=83=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81=D1=83?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE=D1=81=D1=82=D0=B0=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D0=BA=D0=B8=20=D0=B2=20=D0=BE=D1=87=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D1=8C=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D0=B0=D1=83=D1=82=D0=B5=D0=BD=D1=82=D0=B8?= =?UTF-8?q?=D1=84=D0=B8=D0=BA=D0=B0=D1=86=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/out_queue_processor.js | 79 +++++++++++++++++++++++++------------ 1 file changed, 53 insertions(+), 26 deletions(-) diff --git a/core/out_queue_processor.js b/core/out_queue_processor.js index ee636fc..a148f4f 100644 --- a/core/out_queue_processor.js +++ b/core/out_queue_processor.js @@ -89,6 +89,8 @@ const appProcess = async prms => { ); //Если структура объекта в норме if (!sCheckResult) { + //Запоминаем текущий статус сообщения + let nOldExecState = prms.queue.nExecState; //Обрабатываем try { //Считываем статус аутентификации сервиса @@ -175,7 +177,7 @@ const appProcess = async prms => { //Применим ответ "До" - флаг отсуствия аутентификации if (!_.isUndefined(resBefore.bUnAuth)) if (resBefore.bUnAuth === true) { - throw new ServerError(SERR_UNAUTH, "Не аутентифицирован"); + throw new ServerError(SERR_UNAUTH, "Нет аутентификации"); } //Применим ответ "До" - контекст работы сервиса if (!_.isUndefined(resBefore.sCtx)) @@ -234,8 +236,7 @@ const appProcess = async prms => { } //Применим ответ "После" - флаг утентификации сервиса if (!_.isUndefined(resAfter.bUnAuth)) - if (resAfter.bUnAuth === true) - throw new ServerError(SERR_UNAUTH, "Не аутентифицирован"); + if (resAfter.bUnAuth === true) throw new ServerError(SERR_UNAUTH, "Нет аутентификации"); //Применим ответ "После" - контекст работы сервиса if (!_.isUndefined(resAfter.sCtx)) if (prms.function.nFnType == objServiceFnSchema.NFN_TYPE_LOGIN) { @@ -274,20 +275,35 @@ const appProcess = async prms => { nQueueId: prms.queue.nId }); } else { - //Нет атуентификации (мы ещё не меняли статус сообщения и это не считается за попытку исполнения, это будет просто сигнал, что надо аутентифицироваться а потом задача снова попадёт в очередь) - res = new ServerError(SERR_UNAUTH, "Не аутентифицирован"); + //Нет атуентификации + throw new ServerError(SERR_UNAUTH, "Нет аутентификации"); } } catch (e) { - //Фиксируем ошибку обработки сервером приложений - в статусе сообщения - res = await dbConn.setQueueState({ - nQueueId: prms.queue.nId, - sExecMsg: makeErrorText(e), - nIncExecCnt: NINC_EXEC_CNT_YES, - nExecState: - prms.queue.nExecCnt + 1 < prms.queue.nRetryAttempts - ? objQueueSchema.NQUEUE_EXEC_STATE_APP_ERR - : objQueueSchema.NQUEUE_EXEC_STATE_ERR - }); + //Если была ошибка аутентификации - возвращаем старый статус не меняя количества попыток + if (e instanceof ServerError && e.sCode == SERR_UNAUTH) { + await dbConn.setQueueState({ + nQueueId: prms.queue.nId, + sExecMsg: makeErrorText(e), + nExecState: nOldExecState, + nResetData: objQueueSchema.NQUEUE_RESET_DATA_YES + }); + res = e; + } else { + //Фиксируем ошибку обработки сервером приложений - в статусе сообщения + res = await dbConn.setQueueState({ + nQueueId: prms.queue.nId, + sExecMsg: makeErrorText(e), + nResetData: + prms.queue.nExecCnt + 1 < prms.queue.nRetryAttempts + ? objQueueSchema.NQUEUE_RESET_DATA_YES + : objQueueSchema.NQUEUE_RESET_DATA_NO, + nIncExecCnt: NINC_EXEC_CNT_YES, + nExecState: + prms.queue.nExecCnt + 1 < prms.queue.nRetryAttempts + ? objQueueSchema.NQUEUE_EXEC_STATE_APP_ERR + : objQueueSchema.NQUEUE_EXEC_STATE_ERR + }); + } //Фиксируем ошибку обработки сервером приложений - в протоколе работы сервиса await logger.error( `Ошибка обработки исходящего сообщения ${prms.queue.nId} сервером приложений: ${makeErrorText(e)}`, @@ -337,7 +353,7 @@ const dbProcess = async prms => { throw new ServerError(SERR_DB_SERVER, prcRes.sMsg); //Если результат - ошибка аутентификации, то и её пробрасываем, но с правильным кодом if (prcRes.sResult == objQueueSchema.SPRC_RESP_RESULT_UNAUTH) - throw new ServerError(SERR_UNAUTH, prcRes.sMsg || "Не аутентифицирован"); + throw new ServerError(SERR_UNAUTH, prcRes.sMsg || "Нет аутентификации"); } //Фиксируем успешное исполнение (полное - дальше обработки нет) - в статусе сообщения res = await dbConn.setQueueState({ @@ -350,16 +366,27 @@ const dbProcess = async prms => { nQueueId: prms.queue.nId }); } catch (e) { - //Фиксируем ошибку обработки сервером БД - в статусе сообщения - await dbConn.setQueueState({ - nQueueId: prms.queue.nId, - sExecMsg: makeErrorText(e), - nIncExecCnt: NINC_EXEC_CNT_YES, - nExecState: - prms.queue.nExecCnt + 1 < prms.queue.nRetryAttempts - ? objQueueSchema.NQUEUE_EXEC_STATE_DB_ERR - : objQueueSchema.NQUEUE_EXEC_STATE_ERR - }); + //Если была ошибка аутентификации - возвращаем на повторную обработку сервером приложений + if (e instanceof ServerError && e.sCode == SERR_UNAUTH) { + await dbConn.setQueueState({ + nQueueId: prms.queue.nId, + sExecMsg: makeErrorText(e), + nExecState: objQueueSchema.NQUEUE_EXEC_STATE_INQUEUE, + nResetData: objQueueSchema.NQUEUE_RESET_DATA_YES + }); + res = e; + } else { + //Фиксируем ошибку обработки сервером БД - в статусе сообщения + res = await dbConn.setQueueState({ + nQueueId: prms.queue.nId, + sExecMsg: makeErrorText(e), + nIncExecCnt: NINC_EXEC_CNT_YES, + nExecState: + prms.queue.nExecCnt + 1 < prms.queue.nRetryAttempts + ? objQueueSchema.NQUEUE_EXEC_STATE_DB_ERR + : objQueueSchema.NQUEUE_EXEC_STATE_ERR + }); + } //Фиксируем ошибку обработки сервером БД - в протоколе работы сервиса await logger.error( `Ошибка обработки исходящего сообщения ${prms.queue.nId} сервером БД: ${makeErrorText(e)}`,