Учёт расписания повторов при включении очередного исходящего сообщения в очередь на отправку серверу приложений
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 -- Íàèìåíîâàíèå êîíòåéíåðà âòîðîãî óðîâíÿ
|
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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user