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