Учёт расписания повторов при включении очередного исходящего сообщения в очередь на отправку серверу приложений

This commit is contained in:
Mikhail Chechnev 2018-12-02 01:35:14 +03:00
parent 43d52c9563
commit e33e0ae2dc

View File

@ -129,6 +129,25 @@ create or replace package PKG_EXS as
SSUB_CONTAINER in varchar2 := null -- Íàèìåíîâàíèå êîíòåéíåðà âòîðîãî óðîâíÿ SSUB_CONTAINER in varchar2 := null -- Íàèìåíîâàíèå êîíòåéíåðà âòîðîãî óðîâíÿ
); );
/* Âû÷èñëåíèå äàòû ñëåäóþùåãî çàïóñêà ðàñïèñàíèÿ */
function UTL_SCHED_CALC_NEXT_DATE
(
DEXEC_DATE in date, -- Äàòà ïðåäûäóùåãî èñïîëíåíèÿ
NRETRY_SCHEDULE in number, -- Ãðàôèê ïåðåçàïóñêà (ñì. êîíñòàíòû NRETRY_SCHEDULE_*)
NRETRY_STEP in number -- Øàã ãðàôèêà ïåðåçàïóñêà
)
return date; -- Äàòà ñëåäóþùåãî çàïóñêà
/* Âûÿñíåíèå íåîáõîäèìîñòè çàïóñêà ïî ðàñïèñàíèþ */
function UTL_SCHED_CHECK_EXEC
(
DEXEC_DATE in date, -- Äàòà ïðåäûäóùåãî èñïîëíåíèÿ
NRETRY_SCHEDULE in number, -- Ãðàôèê ïåðåçàïóñêà (ñì. êîíñòàíòû NRETRY_SCHEDULE_*)
NRETRY_STEP in number, -- Øàã ãðàôèêà ïåðåçàïóñêà
DEXEC in date := sysdate -- Äàòà, îòíîñèòåëüíî êîòîðîé íåîáõîäèìî âûïîëíèòü ïðîâåðêó
)
return boolean; -- Ïðèçíàê íåîáõîäèìîñòè çàïóñêà
/* Óñòàíîâêà çíà÷åíèÿ òèïà ñòðîêà ïàðàìåòðà ïðîöåäóðû îáðàáîòêè ñîîáùåíèÿ îáìåíà */ /* Óñòàíîâêà çíà÷åíèÿ òèïà ñòðîêà ïàðàìåòðà ïðîöåäóðû îáðàáîòêè ñîîáùåíèÿ îáìåíà */
procedure PRC_RESP_ARG_STR_SET procedure PRC_RESP_ARG_STR_SET
( (
@ -645,6 +664,95 @@ create or replace package body PKG_EXS as
PKG_CONTVARGLB.PURGE(SCONTAINER => UTL_CONTAINER_MAKE_NAME(NIDENT => NIDENT, SSUB_CONTAINER => SSUB_CONTAINER)); PKG_CONTVARGLB.PURGE(SCONTAINER => UTL_CONTAINER_MAKE_NAME(NIDENT => NIDENT, SSUB_CONTAINER => SSUB_CONTAINER));
end UTL_CONTAINER_PURGE; end UTL_CONTAINER_PURGE;
/* Âû÷èñëåíèå äàòû ñëåäóþùåãî çàïóñêà ðàñïèñàíèÿ */
function UTL_SCHED_CALC_NEXT_DATE
(
DEXEC_DATE in date, -- Äàòà ïðåäûäóùåãî èñïîëíåíèÿ
NRETRY_SCHEDULE in number, -- Ãðàôèê ïåðåçàïóñêà (ñì. êîíñòàíòû NRETRY_SCHEDULE_*)
NRETRY_STEP in number -- Øàã ãðàôèêà ïåðåçàïóñêà
)
return date -- Äàòà ñëåäóþùåãî çàïóñêà
is
begin
/* Åñëè íåò äàòû ïðåäûäóùåãî çàïóñêà èëè ðàñïèñàíèå íå îïðåäåëåíî, òî äàòà î÷åðåäíîãî çàïóñêà - ýòî òåêóùàÿ äàòà */
if (DEXEC_DATE is null) or (NRETRY_SCHEDULE = NRETRY_SCHEDULE_UNDEF) then
/* Îòíèìèì ìèíóòêó - äëÿ âåðíîñòè */
return sysdate -(1 / (24 * 60));
else
/* Ðàñ÷èòàåì â çàâèñèìîñòè îò òèïà ðàñïèñàíèÿ */
case NRETRY_SCHEDULE
/* Åæåñåêóíäíî */
when NRETRY_SCHEDULE_SEC then
begin
return DEXEC_DATE +(1 / (24 * 60 * 60)) * NRETRY_STEP;
end;
/* Åæåìèíóòíî */
when NRETRY_SCHEDULE_MIN then
begin
return DEXEC_DATE +(1 / (24 * 60)) * NRETRY_STEP;
end;
/* Åæå÷àñíî */
when NRETRY_SCHEDULE_HOUR then
begin
return DEXEC_DATE +(1 / 24) * NRETRY_STEP;
end;
/* Åæåäíåâíî */
when NRETRY_SCHEDULE_DAY then
begin
return DEXEC_DATE + 1 * NRETRY_STEP;
end;
/* Åæåíåäåëüíî */
when NRETRY_SCHEDULE_WEEK then
begin
return DEXEC_DATE +(1 * 7) * NRETRY_STEP;
end;
/* Åæåìåñÿ÷íî */
when NRETRY_SCHEDULE_MONTH then
begin
return ADD_MONTHS(DEXEC_DATE, NRETRY_STEP);
end;
/* Íåïîääåðæèâàåìûé òèï ðàñïèñàíèÿ */
else
return null;
end case;
end if;
return null;
exception
when others then
return null;
end UTL_SCHED_CALC_NEXT_DATE;
/* Âûÿñíåíèå íåîáõîäèìîñòè çàïóñêà ïî ðàñïèñàíèþ */
function UTL_SCHED_CHECK_EXEC
(
DEXEC_DATE in date, -- Äàòà ïðåäûäóùåãî èñïîëíåíèÿ
NRETRY_SCHEDULE in number, -- Ãðàôèê ïåðåçàïóñêà (ñì. êîíñòàíòû NRETRY_SCHEDULE_*)
NRETRY_STEP in number, -- Øàã ãðàôèêà ïåðåçàïóñêà
DEXEC in date := sysdate -- Äàòà, îòíîñèòåëüíî êîòîðîé íåîáõîäèìî âûïîëíèòü ïðîâåðêó
)
return boolean -- Ïðèçíàê íåîáõîäèìîñòè çàïóñêà
is
DEXEC_NEXT date; -- Hàñ÷åòíàÿ äàòà ñëåäóþùåãî çàïóñêà
begin
/* Ðàñ÷èòàåì äàòó ñëåäóþùåãî çàïóñêà */
DEXEC_NEXT := UTL_SCHED_CALC_NEXT_DATE(DEXEC_DATE => DEXEC_DATE,
NRETRY_SCHEDULE => NRETRY_SCHEDULE,
NRETRY_STEP => NRETRY_STEP);
/* Åñëè íå ðàñ÷èòàëàñü - òî çàïóñêàòü íå ìîæåì */
if (DEXEC_NEXT is null) then
return false;
end if;
/* Åñëè îíà ðàíüøå óêàçàííîé - íàäî èñïîëíÿòü */
if (DEXEC_NEXT <= DEXEC) then
return true;
end if;
/* Èñïîëÿòü íå íàäî */
return false;
exception
when others then
return false;
end UTL_SCHED_CHECK_EXEC;
/* Óñòàíîâêà çíà÷åíèÿ òèïà ñòðîêà ïàðàìåòðà ïðîöåäóðû îáðàáîòêè ñîîáùåíèÿ îáìåíà */ /* Óñòàíîâêà çíà÷åíèÿ òèïà ñòðîêà ïàðàìåòðà ïðîöåäóðû îáðàáîòêè ñîîáùåíèÿ îáìåíà */
procedure PRC_RESP_ARG_STR_SET procedure PRC_RESP_ARG_STR_SET
( (
@ -1224,10 +1332,6 @@ create or replace package body PKG_EXS as
REXSSERVICEFN EXSSERVICEFN%rowtype; -- Çàïèñü ôóíêöèè îáðàáîòêè REXSSERVICEFN EXSSERVICEFN%rowtype; -- Çàïèñü ôóíêöèè îáðàáîòêè
NRESULT number(17); -- Ðåçóëüòàò ðàáîòû NRESULT number(17); -- Ðåçóëüòàò ðàáîòû
begin begin
/*
TODO: owner="mikha" created="30.11.2018"
text="Ðåàëèçîâàòü ïðîâåðêó ïîâòîðà èñïîëíåíèÿ"
*/
/* Èíèöèàëèçèðóåì ðåçóëüòàò */ /* Èíèöèàëèçèðóåì ðåçóëüòàò */
NRESULT := NQUEUE_EXEC_NO; NRESULT := NQUEUE_EXEC_NO;
begin begin
@ -1241,7 +1345,12 @@ create or replace package body PKG_EXS as
if ((REXSSERVICE.SRV_TYPE = NSRV_TYPE_SEND) and if ((REXSSERVICE.SRV_TYPE = NSRV_TYPE_SEND) and
(REXSQUEUE.EXEC_STATE in (REXSQUEUE.EXEC_STATE in
(NQUEUE_EXEC_STATE_INQUEUE, NQUEUE_EXEC_STATE_APP_ERR, NQUEUE_EXEC_STATE_DB_ERR, NQUEUE_EXEC_STATE_ERR)) and (NQUEUE_EXEC_STATE_INQUEUE, NQUEUE_EXEC_STATE_APP_ERR, NQUEUE_EXEC_STATE_DB_ERR, NQUEUE_EXEC_STATE_ERR)) and
(REXSQUEUE.EXEC_CNT < REXSSERVICEFN.RETRY_ATTEMPTS)) then (((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
(UTL_SCHED_CHECK_EXEC(DEXEC_DATE => REXSQUEUE.EXEC_DATE,
NRETRY_SCHEDULE => REXSSERVICEFN.RETRY_SCHEDULE,
NRETRY_STEP => REXSSERVICEFN.RETRY_STEP))) then
/* Íàäî èñïîëíÿòü */ /* Íàäî èñïîëíÿòü */
NRESULT := NQUEUE_EXEC_YES; NRESULT := NQUEUE_EXEC_YES;
end if; end if;