Projet BPMS Sagex-18305 Interopérabilité de systèmes d information d entreprise Guide d utilisation du gestionnaire de tâches d Oracle DBMS_JOB Table des matières 1 Préambule 1 2 Rappel de quelques commandes essentielles 1 3 Gestion des erreurs 2 3.1 Notification d erreur et arrêt d un job 2 3.2 Relance d un job 2 4 Mise en œuvre au sein de notre démonstrateur 3 4.1 Objets spécifiques à créer 3 4.2 Déclenchement 4 4.3 Mécanismes de garantie de robustesse 4 1 Préambule Comme indiqué dans nos documents de description et de rapport de réalisation du démonstrateur d interopérabilité, nous avons utilisé la librairie DBMS_JOB d Oracle pour simuler l automatisation des tâches de chaque partenaire de la chaîne logistique. Pour une explication complète, le lecteur se référera à la documentation officielle d Oracle ; notre petit guide s attache seulement à mettre en évidence quelques éléments importants liés aux traitements d erreurs. 2 Rappel de quelques commandes essentielles Voir la liste des jobs Ajouter un job Supprimer un job select * from all_jobs; dbms_job.submit(num_job, ) dbms_job.remove(num_job); Guide.doc Diagramme d activités du processus global
Remarque: Chaque job est un objet qui est visible sous forme d un enregistrement de la vue all_jobs. 3 Gestion des erreurs 3.1 Notification d erreur et arrêt d un job Lorsque le gestionnaire de jobs rencontre une erreur, il incrémente la valeur de FAILURES ; lorsque cellecelle-ci atteint la valeur de 16, la propriété BROCKEN passe de N à Y. select job, what, broken, failures from all_jobs; Remarque : La propriété WHAT réfère la procédure à exécuter par le job. 3.2 Relance d un job Un job arrêté, propriété BROCKEN à Y, est relancé à l aide d une des 2 commandes ci-dessous Relancer un job immédiatement Relancer un job en respectant l horaire de déclenchement dbms_job.run(num_job) dbms_job.submit(num_job, ) -- Contrôle que le job est bien actif et l'active si nécessaire SELECT JOB, UPPER(TRIM(BROKEN)) INTO vl_numjob, vl_casse FROM all_jobs WHERE TRIM(WHAT) = 'SCHEDUL_PACK.EXECUTE_FILE_ATTENTE;'; IF vl_casse = 'Y' THEN dbms_job.broken(vl_numjob,false); Guide.doc 2/5
4 Mise en œuvre au sein de notre démonstrateur Un job a été créé au sein de la base de données de chaque partenaire réalisé en PL/SQL et pour lequel les processus doivent être déclenchés et finalisés automatiquement par une horloge simulant une intervention humaine. 4.1 Objets spécifiques à créer Nous créons les objets suivants au sein du schéma de chaque partenaire fournissant des processus automatiques. - Une table d ordre ORDRES est créée en même temps les autres objets du schéma. - Une procédure d exécution des ordres SQL de la table d ordre est créée /* Procédure d'exécution des ordres SQL contenus dans la table d'ordres. */ PROCEDURE EXECUTE_FILE_ATTENTE IS * CURSOR c_ordre IS SELECT ordre_sql, date_minexe FROM ordres ORDER BY NUMERO DESC FOR UPDATE ; BEGIN FOR curs IN c_ordre LOOP IF (curs.date_minexe <= SYSDATE) THEN EXECUTE IMMEDIATE curs.ordre_sql; DELETE FROM ORDRES WHERE CURRENT OF c_ordre; END LOOP; END; - Un job invoquant à intervalle régulier la procédure ci-dessus. Guide.doc 3/5
4.2 Déclenchement Lors de chaque ajout 1 d un enregistrement dans la table de l objet métier du partenaire (commande pour le détaillant et le producteur, demande de transport pour le transporteur), nous insérons une ligne dans la table d ordre SELECT ORD_SEQ.NEXTVAL INTO VL_NUMORD FROM DUAL ; INSERT INTO ORDRES(NUMERO, ORDRE_SQL, DATE_MINEXE) VALUES (VL_NUMORD, 'BEGIN PROCESS_PACK.PROCESSDEMTRANS(' :NEW.DET_NUMERO ', ' :NEW.NUMERO ', SYSDATE); END;', SYSDATE + 1.0/24/60/60*10); 4.3 Mécanismes de garantie de robustesse 1. Lors de l ajout d un enregistrement dans la table de l objet métier du partenaire, nous nous assurons que le job est bien actif ; si tel n 0est pas le cas, nous le réactivons. -- Contrôle que le job est bien actif et l'active si nécessaire SELECT JOB, UPPER(TRIM(BROKEN)) INTO vl_numjob, vl_casse FROM all_jobs WHERE TRIM(WHAT) = 'SCHEDUL_PACK.EXECUTE_FILE_ATTENTE;'; IF vl_casse = 'Y' THEN dbms_job.broken(vl_numjob,false); -- Insert dans la table d'ordres, l'ordre SQL d'exécution de la procédure processus de demande de transport: SELECT ORD_SEQ.NEXTVAL INTO VL_NUMORD FROM DUAL ; INSERT INTO ORDRES(NUMERO, ORDRE_SQL, DATE_MINEXE) VALUES (VL_NUMORD, 'BEGIN PROCESS_PACK.PROCESSDEMTRANS(' :NEW.DET_NUMERO ', ' :NEW.NUMERO ', SYSDATE); END;', SYSDATE + 1.0/24/60/60*10); 1 ou de changement d état provoquant le déclenchement d un processus Guide.doc 4/5
2. Nous mettons un traitement d erreur à chaque procédure invoquée lors de l exécution de la table d ordre. PROCEDURE PROCESSDEMTRANS (PE_RETAILERID IN INTEGER,PE_ORDERID IN INTEGER,PE_DELIVERYDATE IN DATE ) IS BEGIN EXCEPTION WHEN OTHERS THEN vl_sqlcode := SQLCODE; -- Enregistrement erreur UPDATE COMMANDES SET ETAT='Erreur PROCESSDEMTRANS: ORA-' TO_CHAR(vl_sqlcode) WHERE NUMERO = PE_ORDERID; END; 3. Nous exécutons les ordres de la table d ordre en sens inverses de l insertion ; ainsi, nous évitons de relancer systématiquement toujours le premier enregistrement si celui-ci devait provoquer une erreur que nous n aurions pas traitée. CURSOR c_ordre IS SELECT ordre_sql, date_minexe FROM ordres ORDER BY NUMERO DESC FOR UPDATE ; Guide.doc 5/5