FLEX#64717 geschedulede commando in seconde-intervallen (savepoint)

svn path=/Database/trunk/; revision=49667
This commit is contained in:
Peter Feij
2021-02-03 17:32:14 +00:00
parent c0bf4b633f
commit 8b7c0f0482
2 changed files with 139 additions and 15 deletions

View File

@@ -117,8 +117,11 @@ CREATE OR REPLACE PACKAGE fac
PROCEDURE clrnotifications (pcode VARCHAR2, pref NUMBER, psubject VARCHAR2, preceiver NUMBER, pextrakey NUMBER);
PROCEDURE clrnotifications_xmlnode (pxmlnode VARCHAR2, prefkey NUMBER);
PROCEDURE clrtracking_xmlnode (pxmlnode VARCHAR2, prefkey NUMBER);
PROCEDURE putnotificationjobs (pcust VARCHAR2);
PROCEDURE putnotificationjobs;
PROCEDURE putcommandjobs;
PROCEDURE putnotificationjobs (pcust VARCHAR2);
PROCEDURE putjobnotifications (pviewname VARCHAR2, pmode NUMBER, pflags NUMBER);
PROCEDURE putjobcommands (pviewname VARCHAR2, pmode NUMBER, pflags NUMBER);
FUNCTION getEmail ( pkey IN NUMBER ) RETURN VARCHAR2;
FUNCTION getMobile ( pkey IN NUMBER ) RETURN VARCHAR2;
PROCEDURE fac_nightly;
@@ -2469,14 +2472,22 @@ CREATE OR REPLACE PACKAGE BODY fac AS
AND ft.fac_tracking_refkey = prefkey);
END;
-- Kijk welke jobs gescheduled zijn en nu uitgevoerd moeten worden.
-- CUST is inmiddels overbodig, nog voor compatibiliteit only
PROCEDURE putnotificationjobs (pcust VARCHAR2)
AS
BEGIN
fac.putnotificationjobs(0);
END;
-- Kijk welke jobs gescheduled zijn en nu uitgevoerd moeten worden.
-- Interne functie
PROCEDURE putjobs (pcommands NUMBER DEFAULT 0)
AS
CURSOR c1
IS
SELECT fac_notificatie_job_key, fac_notificatie_job_view, fac_notificatie_job_oms,
fac_notificatie_job_interval, fac_notificatie_job_mode, fac_notificatie_job_nextrun,
fac_notificatie_job_flags
fac_notificatie_job_flags, fac_notificatie_job_seconds
FROM fac_notificatie_job
WHERE fac_notificatie_job_nextrun <= SYSDATE OR fac_notificatie_job_nextrun IS NULL; -- eerste keer
tnextrun fac_notificatie_job.fac_notificatie_job_nextrun%TYPE;
@@ -2484,7 +2495,13 @@ CREATE OR REPLACE PACKAGE BODY fac AS
FOR rec1 IN c1
LOOP
-- Voer de job uit
putjobnotifications (rec1.fac_notificatie_job_view, rec1.fac_notificatie_job_mode, rec1.fac_notificatie_job_flags);
IF pcommands = 1 AND BITAND(rec1.fac_notificatie_job_flags,32) = 32
THEN
putjobcommands (rec1.fac_notificatie_job_view, rec1.fac_notificatie_job_mode, rec1.fac_notificatie_job_flags);
ELSE
putjobnotifications (rec1.fac_notificatie_job_view, rec1.fac_notificatie_job_mode, rec1.fac_notificatie_job_flags);
END IF;
UPDATE fac_notificatie_job
SET fac_notificatie_job_lastrun = SYSDATE
WHERE fac_notificatie_job_key = rec1.fac_notificatie_job_key;
@@ -2496,12 +2513,22 @@ CREATE OR REPLACE PACKAGE BODY fac AS
WHILE tnextrun <= SYSDATE
LOOP
-- Interval in hrs, DATE arithmetics are in days, so we will have to divide by 24 hrs a day
UPDATE fac_notificatie_job
SET fac_notificatie_job_nextrun =
COALESCE (fac_notificatie_job_nextrun, SYSDATE)
+ rec1.fac_notificatie_job_interval / 24
WHERE fac_notificatie_job_key = rec1.fac_notificatie_job_key;
IF pcommands = 1 AND BITAND(rec1.fac_notificatie_job_flags,32) = 32
THEN
-- Command-interval in seconds, DATE arithmetics are in days, so we will have to divide by 24*60*60 seconds a day
UPDATE fac_notificatie_job
SET fac_notificatie_job_nextrun =
COALESCE (fac_notificatie_job_nextrun, SYSDATE)
+ rec1.fac_notificatie_job_seconds / 24*60*60
WHERE fac_notificatie_job_key = rec1.fac_notificatie_job_key;
ELSE
-- Notify-interval in hrs, DATE arithmetics are in days, so we will have to divide by 24 hrs a day
UPDATE fac_notificatie_job
SET fac_notificatie_job_nextrun =
COALESCE (fac_notificatie_job_nextrun, SYSDATE)
+ rec1.fac_notificatie_job_interval / 24
WHERE fac_notificatie_job_key = rec1.fac_notificatie_job_key;
END IF;
SELECT fac_notificatie_job_nextrun
INTO tnextrun
@@ -2511,6 +2538,18 @@ CREATE OR REPLACE PACKAGE BODY fac AS
END LOOP;
END;
-- Dit zijn de 2 die weg bebruikt moeten worden in de schedules
PROCEDURE putnotificationjobs
AS
BEGIN
fac.putjobs (0);
END;
PROCEDURE putcommandjobs
AS
BEGIN
fac.putjobs (1);
END;
-- Voer nu job pcode uit.
PROCEDURE putjobnotifications (pviewname VARCHAR2, pmode NUMBER, pflags NUMBER)
AS
@@ -2625,9 +2664,91 @@ CREATE OR REPLACE PACKAGE BODY fac AS
EXCEPTION
WHEN OTHERS
THEN
putsystemnotification ('FACILITOR: invalid notification job/view ' || pviewname ||' '|| SQLERRM , 3);
putsystemnotification ('Facilitor notifier: Invalid notification job ' || pviewname ||' ('|| SQLERRM ||')' , 3);
END;
-- FLEX#64717 Deze zet commando's in de (notificatie)queue, die worden verstuurd
-- volgens de parameters van bedrijfadres. De pmode heeft minstens een 32-bitje gezet
-- waardoor de queuehandler (putorders) weet dat het geen gewone notificatie is, maar
-- een handler. Optioneel is er ook nog een 16-bit (dus pmode=48) dat net als bij notificaties een
-- tracking bij de betreffende entiteit registreert.
PROCEDURE putjobcommands (pviewname VARCHAR2, pmode NUMBER, pflags NUMBER)
AS
TYPE noticursortype IS REF CURSOR;
commands noticursortype;
lbedrijfadres_key prs_bedrijfadres.prs_bedrijfadres_key%TYPE;
lxmlnode fac_srtnotificatie.fac_srtnotificatie_xmlnode%TYPE;
ldatum fac_notificatie.fac_notificatie_datum%TYPE;
ltext fac_notificatie.fac_notificatie_oms%TYPE;
lcode fac_srtnotificatie.fac_srtnotificatie_code%TYPE;
lrefkey fac_notificatie.fac_notificatie_refkey%TYPE;
lsrtnotificatie_key fac_srtnotificatie.fac_srtnotificatie_key%TYPE;
BEGIN
-- flags: 16 = do tracking of text (requires code, key and text to be NOT NULL)
-- 32 = execute *this* function
OPEN commands FOR -- goed nadenken, deze namen zijn voor eeuwig. is notbefore nodig?
'SELECT prs_bedrijfadres_key, xmlnode, refkey, datum, waarde, code FROM '
|| pviewname;
LOOP
FETCH commands
INTO lbedrijfadres_key,
lxmlnode,
lrefkey,
ldatum,
ltext,
lcode;
EXIT WHEN commands%NOTFOUND;
IF LENGTH(ltext) > 2048
THEN
raise_application_error (-20001, 'Facilitor warning: Jobcommand too long');
END IF;
IF lcode IS NOT NULL
THEN
SELECT fac_srtnotificatie_key
INTO lsrtnotificatie_key
FROM fac_srtnotificatie
WHERE fac_srtnotificatie_code = lcode;
END IF;
IF BITAND (pflags, 16) = 16
AND lcode IS NOT NULL
AND lxmlnode IS NOT NULL
AND lrefkey IS NOT NULL
AND ltext IS NOT NULL
THEN
fac.trackaction (lcode,
lrefkey,
NULL,
NULL,
ltext);
END IF;
INSERT INTO fac_notificatie (fac_notificatie_status,
fac_notificatie_datum,
fac_notificatie_oms,
fac_notificatie_refkey,
prs_bedrijfadres_key,
fac_srtnotificatie_key)
VALUES (pmode,
ldatum,
SUBSTR (ltext, 1, 2048),
lrefkey,
lbedrijfadres_key,
lsrtnotificatie_key);
END LOOP;
CLOSE commands;
EXCEPTION
WHEN OTHERS
THEN
putsystemnotification ('Facilitor notifier: Invalid commands-job ' || pviewname || ' (' || SQLERRM ||')', 3);
END;
PROCEDURE executeactiviteit (pxmlnode VARCHAR2, pactkey NUMBER)
AS
CURSOR berekendeflex (
@@ -2946,10 +3067,10 @@ CREATE OR REPLACE PACKAGE BODY fac AS
WHEN OTHERS
THEN
putsystemnotification (
'Facilitor scheduler: opdracht voor activiteit '
'Facilitor scheduler: Unable to create planned activity '
|| pactkey
|| ' kan niet worden aangemaakt: '
|| SQLERRM,
|| ' ('
|| SQLERRM||')',
3);
END;
END;

View File

@@ -587,6 +587,7 @@ CREATE_TABLE(fac_srtnotificatie, 0)
/*
* fac_notificatie_status: de actuele verzendingsstatus. Bij de insert is deze gelijk aan fac_srtnotificatie_mode
* waarin bitwise is aangegeven hoe de notificatie verspreid moet worden:
* 32 = POST conform prs_bedrijfadres
* 16 = POST naar prs_perslid_systeemadres
* 8 = popup aan receiver prs_perslid_key
* 4 = per sms aan receiver prs_perslid_mobiel
@@ -663,9 +664,11 @@ CREATE_TABLE(fac_notificatie_job, 0)
fac_notificatie_job_mode
NUMBER(3),
fac_notificatie_job_flags
NUMBER(10) default 0, -- 1=view has xemail and xmobile, 2=use fac.notifytracking instead of fac.putnotification(srtprio)
NUMBER(10) default 0, -- &1=view has xemail and xmobile, &2=use fac.notifytracking instead of fac.putnotification(srtprio), &32=commando
fac_notificatie_job_interval
NUMBER(5),
fac_notificatie_job_seconds
NUMBER(5),
fac_notificatie_job_nextrun
DATE,
fac_notificatie_job_lastrun