Поле "nRetryAttempts" в записи очереди, модификация алгоритма выдачи сообщений на обработку (отдаём все, кроме имеющих финальный статус успех или ошибка или обрабатываемых в текущий момент), модификация алгоритма установки состояния записи очереди (появилось возможность не менять состояние, а просто инкерементировать счётчик попыток)

This commit is contained in:
Mikhail Chechnev 2018-12-05 22:24:33 +03:00
parent a644f08aac
commit da02beb05c

View File

@ -339,7 +339,7 @@ create or replace package PKG_EXS as
procedure QUEUE_EXEC_STATE_SET
(
NEXSQUEUE in number, -- Ðåã. íîìåð çàïèñè î÷åðåäè
NEXEC_STATE in number, -- Óñòàíàâëèâàåìîå ñîñòîÿíèå
NEXEC_STATE in number, -- Óñòàíàâëèâàåìîå ñîñòîÿíèå (ñì. êîíñòíàòû NQUEUE_EXEC_STATE_*, null - íå ìåíÿòü)
SEXEC_MSG in varchar2, -- Ñîîáùåíèå îáðàáîò÷èêà
NINC_EXEC_CNT in number, -- Ôëàã èíêðåìåíòà ñ÷¸ò÷èêà èñïîëíåíèé (ñì. êîíñòíàòû NINC_EXEC_CNT_*, null - íå ìåíÿòü)
RCQUEUE out sys_refcursor -- Êóðñîð ñ èçìåí¸ííîé ïîçèöèåé î÷åðåäè
@ -1292,6 +1292,7 @@ create or replace package body PKG_EXS as
T.EXEC_DATE "dExecDate",
TO_CHAR(T.EXEC_DATE, 'dd.mm.yyyy hh24:mi:ss') "sExecDate",
T.EXEC_CNT "nExecCnt",
F.RETRY_ATTEMPTS "nRetryAttempts",
T.EXEC_STATE "nExecState",
DECODE(T.EXEC_STATE,
NQUEUE_EXEC_STATE_INQUEUE,
@ -1371,11 +1372,8 @@ create or replace package body PKG_EXS as
REXSSERVICE := GET_EXSSERVICE_ID(NFLAG_SMART => 0, NRN => REXSSERVICEFN.PRN);
/* Ïðîâåðèì óñëîâèÿ èñïîëíåíèÿ - èñõîäÿùåå, íåäîèñïîëíåíî, è îñòàëèñü ïîïûòêè */
if ((REXSSERVICE.SRV_TYPE = NSRV_TYPE_SEND) and
(REXSQUEUE.EXEC_STATE in (NQUEUE_EXEC_STATE_INQUEUE,
NQUEUE_EXEC_STATE_APP_OK,
NQUEUE_EXEC_STATE_APP_ERR,
NQUEUE_EXEC_STATE_DB_ERR,
NQUEUE_EXEC_STATE_ERR)) and
(REXSQUEUE.EXEC_STATE not in
(NQUEUE_EXEC_STATE_OK, NQUEUE_EXEC_STATE_ERR, NQUEUE_EXEC_STATE_APP, NQUEUE_EXEC_STATE_DB)) and
(((REXSSERVICEFN.RETRY_SCHEDULE <> NRETRY_SCHEDULE_UNDEF) and
(REXSQUEUE.EXEC_CNT < REXSSERVICEFN.RETRY_ATTEMPTS)) or
((REXSSERVICEFN.RETRY_SCHEDULE = NRETRY_SCHEDULE_UNDEF) and (REXSQUEUE.EXEC_CNT = 0))) and
@ -1426,7 +1424,7 @@ create or replace package body PKG_EXS as
procedure QUEUE_EXEC_STATE_SET
(
NEXSQUEUE in number, -- Ðåã. íîìåð çàïèñè î÷åðåäè
NEXEC_STATE in number, -- Óñòàíàâëèâàåìîå ñîñòîÿíèå
NEXEC_STATE in number, -- Óñòàíàâëèâàåìîå ñîñòîÿíèå (ñì. êîíñòíàòû NQUEUE_EXEC_STATE_*, null - íå ìåíÿòü)
SEXEC_MSG in varchar2, -- Ñîîáùåíèå îáðàáîò÷èêà
NINC_EXEC_CNT in number, -- Ôëàã èíêðåìåíòà ñ÷¸ò÷èêà èñïîëíåíèé (ñì. êîíñòíàòû NINC_EXEC_CNT_*, null - íå ìåíÿòü)
RCQUEUE out sys_refcursor -- Êóðñîð ñ èçìåí¸ííîé ïîçèöèåé î÷åðåäè
@ -1439,7 +1437,8 @@ create or replace package body PKG_EXS as
P_EXCEPTION(0,
'Íå óêàçàí èäåíòèôèêàòîð ïîçèöèè î÷åðåäè äëÿ èçìåíåíèÿ ñîñòîÿíèÿ');
end if;
if (NEXEC_STATE not in (NQUEUE_EXEC_STATE_INQUEUE,
if ((NEXEC_STATE is not null) and
(NEXEC_STATE not in (NQUEUE_EXEC_STATE_INQUEUE,
NQUEUE_EXEC_STATE_APP,
NQUEUE_EXEC_STATE_APP_OK,
NQUEUE_EXEC_STATE_APP_ERR,
@ -1447,7 +1446,7 @@ create or replace package body PKG_EXS as
NQUEUE_EXEC_STATE_DB_OK,
NQUEUE_EXEC_STATE_DB_ERR,
NQUEUE_EXEC_STATE_OK,
NQUEUE_EXEC_STATE_ERR)) then
NQUEUE_EXEC_STATE_ERR))) then
P_EXCEPTION(0,
'Êîä ñîñòîÿíèÿ "%s" ïîçèöèè î÷åðåäè íå ïîääåðæèâàåòñÿ',
TO_CHAR(NEXEC_STATE));
@ -1466,7 +1465,7 @@ create or replace package body PKG_EXS as
/* Âûñòàâèì ñîñòîÿíèå */
update EXSQUEUE T
set T.EXEC_DATE = sysdate,
T.EXEC_STATE = NEXEC_STATE,
T.EXEC_STATE = NVL(NEXEC_STATE, T.EXEC_STATE),
T.EXEC_CNT = REXSQUEUE.EXEC_CNT,
T.EXEC_MSG = SEXEC_MSG
where T.RN = NEXSQUEUE;