Учёт расписания повторов при включении очередного исходящего сообщения в очередь на отправку серверу приложений
This commit is contained in:
parent
43d52c9563
commit
e33e0ae2dc
119
db/PKG_EXS.pck
119
db/PKG_EXS.pck
@ -129,6 +129,25 @@ create or replace package PKG_EXS as
|
||||
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
|
||||
(
|
||||
@ -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));
|
||||
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
|
||||
(
|
||||
@ -1224,10 +1332,6 @@ create or replace package body PKG_EXS as
|
||||
REXSSERVICEFN EXSSERVICEFN%rowtype; -- Çàïèñü ôóíêöèè îáðàáîòêè
|
||||
NRESULT number(17); -- Ðåçóëüòàò ðàáîòû
|
||||
begin
|
||||
/*
|
||||
TODO: owner="mikha" created="30.11.2018"
|
||||
text="Ðåàëèçîâàòü ïðîâåðêó ïîâòîðà èñïîëíåíèÿ"
|
||||
*/
|
||||
/* Èíèöèàëèçèðóåì ðåçóëüòàò */
|
||||
NRESULT := NQUEUE_EXEC_NO;
|
||||
begin
|
||||
@ -1241,7 +1345,12 @@ create or replace package body PKG_EXS as
|
||||
if ((REXSSERVICE.SRV_TYPE = NSRV_TYPE_SEND) and
|
||||
(REXSQUEUE.EXEC_STATE in
|
||||
(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;
|
||||
end if;
|
||||
|
Loading…
x
Reference in New Issue
Block a user