SII du transporteur avec BPEL Projet BPMS Dernière modification : 18.12.2007 Table des matières 1. INTRODUCTION...3 2. SERVEURS...3 2.1. RÉFÉRENTIEL DESIGNER...3 2.2. SERVEUR DE BASE DE DONNÉES...3 2.3. SERVEUR D APPLICATION...3 2.4. SERVER D INTÉGRATION...3 3. GÉNÉRATION...4 3.1. STRUCTURE...4 3.2. SERVICES WEB...4 3.3. APPEL DES WS...4 3.4. PROCESSUS INTERNES...4 4. RÉALISATION DES PROCESSUS DU TRANSPORTEUR AVEC BPEL...5 4.1. PROCESSUS «TRAITER DEMANDE»...5 4.1.1. Création de l application et du projet BPEL...5 4.1.2. Edition des paramètres d I/O du processus BPEL (schéma XSD)...6 4.1.3. Programmation de la livraison...7 4.1.4. Insertion de la livraison dans notre schéma (transporteur)...7 4.1.4.1. Création d un «Database Adapter» pour l insertion de la livraison...7 4.1.4.2. Création d un «Database Adapter» pour retrouver la pk de la livraison...9 4.1.4.3. Création d un «Database Adapter» pour retrouver la PK du véhicule...10 4.1.4.4. Création du scope «InsertLivraisonIntoTransporteurDB» et de ses variables...11 4.1.4.5. Retrouver la PK de la livraison («GetLivId» Invoque Activity)...12 4.1.4.6. Retrouver le numéro du véhicule («GetVehId» Invoque Activity)...13 4.1.4.7. Préparer les valeurs pour l insertion de la livraison («AssignLivraisonValues» Assign Activity) 14 4.1.4.8. Insertion dans la table livraison («InsertLivraison» Invoke Activity)...16 4.1.5. Invocation du Service Web C (WSPorductor confirmtransport)...17 4.1.5.1. Création du Partner Link...17 4.1.5.2. Création du Scope Activity...18 4.1.5.3. Création d une Invoke Activity...18 4.1.5.4. Créer une Assign Activity pour permettre d assigner des valeurs d entré au WS...18 4.1.5.5. Créer une Assign Activity pour assigner des valeurs de retour du processus...20 4.1.6. Résultat graphique...21 4.2. PROCESSUS «CHARGEMENT DE LA MARCHANDISE»...22 4.2.1. Création du projet BPEL...22 4.2.2. Edition de paramètres d I/O du processus BPEL (schéma XSD)...23 4.2.3. Recherche des lignes de livraisons...23 4.2.4. Calcul du nombre de cartons et palettes...23 Auteur : nicolas.portmann@he-arc.ch!!! ATTENTION!!! VERSION EN COURS DE REALISTION
4.2.5. Recherche du numéro de l id de la commande...23 4.2.5.1. Création du Database Adapter «GetCmdId»...24 4.2.5.2. Création de l activité d invocation «Invoke_GetCmdId»...25 4.2.5.3. Création de l activité de copie «Assign_GetCmdId_Input»...25 4.2.6. Invocation du Service Web F (WSProductor confirmaor)...26 4.2.6.1. Création du partner link...26 4.2.6.2. Création du scope activity «ConfirmAoR»...26 4.2.6.3. Création d une Invoke Activity «Invoke_WSProductor_ConfirmAoR»...26 4.2.6.4. Assigner les valeurs d entrée du WS «Assign_Input_WSF»...27 4.2.6.5. Création de l activité d assignation «Assign_Output_WSF»...29 4.2.7. Invocation du Service Web F2 (WSRetailer loadingleft)...30 4.2.8. Résultat graphique...31 4.3. COMPILATION ET TEST...32 Auteur : Page 2 sur 33 18.12.2007
1. Introduction Pour cette phase, il s agit de réaliser les processus internes du transporteur à l aide de BPEL. 2. Serveurs Tout comme pour les phases précédentes, il s agit de simuler les SII des 3 acteurs. 2.1. Référentiel Designer Export/Import du projet TRANSPORTEUR de la phase précédente dans le projet BPEL. Export/Import du projet PRODUCTEUR de la phase précédente dans le projet BPEL. Export/Import du projet DETAILLANT de la phase précédente dans le projet BPEL. 2.2. Serveur de base de données Création de nouveaux schémas sur prod10g : Username : BPMSTRANS_3 Passeword : ********** Username : BPMSDET_3 Passeword : ********* Username : BPMSPROD_3 Passeword : ********** 2.3. Serveur d application Serveur d application de production : http://iasprod.ig.he-arc.ch:80 Port : 80 (et non 8888) Instance : lglhome Usr/psw : oc4jlgl/******* 2.4. Server d intégration Server d intégration (pour faire tourner les processus BPEL) : Configuration depuis JDeveloper pour le moment déploiement sur iasdev: Connection Name : BPELServer Application Server : IASDEV Host Name : iasdev.ig.he-arc.ch Port : 80 Auteur : Page 3 sur 33 18.12.2007
3. Génération Pour nos trois acteurs, il s agit de générer les objets adéquats 3.1. Structure Générer les tables et séquences dans les schémas «BPMS<acteurs>_3». Peupler les tables. 3.2. Services Web Nous devons regénérer nos services web afin qu ils manipulent les données du bon schéma. - Générer les packages contenant les fonctions PL/SQL dans les schémas adéquats (DET_PACK dans BPMSDET_3 ; TRANS_PACK dans BPMSTRANS_3 et PROD_PACK dans BPMSPROD_3). - A l aide de JDeveloper, générer les WS à partir des packages ci-dessus. 3.3. Appel des WS Modifier et générer les packages du détaillant et du producteur permettant d invoquer les WS des partenaires. Les appels des WS partenaires depuis le transporteur (WS C, F et F2) seront effectués depuis les processus BPEL. Pour le détaillant, les packages INVWSPROD_PACK et INVWSTRANS_PACK: Appel WS A INVWSPROD_PACK.NEWORDER Appel WS G INVWSTRANS_PACK.CONFIRMDELIVERY Appel WS H INVWSPROD_PACK.CONFIRMAOD Pour le producteur, les packages INVWSTRANS_PACK et INVWSDET_PACK: Appel WS B INVWSTRANS_PACK.REQUESTTRANSPORT Appel WS D INVWSDET_PACK.NOTICEOFDELIVERY Appel WS E INVWSTRANS_PACK.LOADINGCONDITIONED 3.4. Processus internes Générer les packages réalisant les processus internes du détaillant et du producteur (PROCESS_PACK du détaillant dans BPMSDET_2 et PROCESS_PACK du producteur dans BPMSPROD_2) ----- Trigger d appel des processus interne ---- Auteur : Page 4 sur 33 18.12.2007
4. Réalisation des processus du transporteur avec BPEL Rappel : les appels des WS partenaires ainsi que les processus internes du transporteur sont réalisés depuis BPEL Référence : - Oracle SOA Suite Developer s Guide 10g (10.1.3.1.0) Chapitre 7 «Using Oracle BPEL Process Manager». - Travail de diplôme d informaticien de gestion HES de Antonio Renna SOA et les Services Web «Automatisation du processus de commandes pour le cas pratique WineMarket» Partie VII. BPEL 4.1. Processus «traiter demande» Il s agit de réaliser un processus BPEL permettant: 1. L insertion de la livraison dans notre schéma (transporteur). Nécessite le chargement préalable du numéro du véhicule utilisé pour la livraison et l interrogation de la séquence de la table livraisons. 2. L invocation du Service Web C (WSPorductor confirmtransport) de notre partenaire producteur. 4.1.1. Création de l application et du projet BPEL Il faut tout d abord créer une application et un projet BPEL dans JDeveloper. Les fichiers suivants sont générés : - BPELProcessTraiterDemande.bpel Un fichier bpel qui contient les activités du processus BPEL. Dans JDeveloper, nous allons construire ce fichier en glissant-déposant les activités et services, créant les variables et les partner links, - BPELProcessTraiterDemande.xsd Un schéma XML pour valider les documents XML impliqué dans le processus. C est dans ce fichier que nous allons définir les paramètres d entrés/sortie du processus BPEL. - BPELProcessTraiterDemande.wsdl C est la description du service web qu est notre projet BPEL. C est notre point d entrée pour invoquer le processus. - Bpel.xml Fichier de configuration de déploiement. Contient différentes informations tel que les fichiers ci-dessus et les services web que l on utilise au travers de partner link. Auteur : Page 5 sur 33 18.12.2007
Copies d écran de la création du projet BPEL synchrone. 4.1.2. Edition des paramètres d I/O du processus BPEL (schéma XSD) Il s agit de définir les paramètres d entrés/sorties de notre processus BPEL en éditant le schéma XSD associé au WSDL du processus. Auteur : Page 6 sur 33 18.12.2007
4.1.3. Programmation de la livraison Rien pour l instant. Dans les versions précédentes, la date de la livraison était obtenue en ajoutant deux jours à la date souhaitée. Ici, on prend la date de souhaité comme date de livraison en attendant l éventuel réalisation d un service qui permettrait de retourner une date de livraison selon x ou y critère 4.1.4. Insertion de la livraison dans notre schéma (transporteur) Voir point 7.6 «Communicating with a Database» de la documentation «Oracle SOA Suite Developer s Guide 10g (10.1.3.1.0)». Voir point 8.7 «Insert Order Informations the Database» de la documentation «Oracle SOA Suite Tutorial Release 3 (10.1.3.1.0)» Nous devons insérer la livraison dans notre schéma et ce, depuis notre processus BPEL. Comme nous n avons pas fait de service web pour cette tâche, nous allons «communiquer» avec notre BD directement depuis notre processus BPEL. Pour une communication entre Oracle BPEL Process Manager et une base de données, la base de données est exposée comme un service web. Comme pour tout autre service web, la communication est définie part un Parner Link. Cependant, pour permettre à un processus BPEL d accéder aux tables de la BD, nous avons également besoin de configurer un adaptateur. Pour accéder à un schéma relationnel existant, il faut utiliser le Adapter Configuration Wizard pour: - Importer un schéma relationnel et le mapper en un schéma XML (XSD). - Effectuer des opérations SQL comme SELECT, INSERT et UPDATE comme des services web. Pour notre cas, nous utiliseront des accès à la base de données pour : - Rechercher le numéro du véhicule dont le code est «CAM001», - Rechercher le numéro suivant de la séquence LIV_SEQ, - Insérer la livraison. 4.1.4.1.Création d un «Database Adapter» pour l insertion de la livraison Glisser-déposer le service «Database Adapter» dans la colonne des services. L assistant d adaptateur de BD s exécute, spécifier le nom, la description les informations de connections, le type d opération et la table qui sera manipulé : Auteur : Page 7 sur 33 18.12.2007
Auteur : Page 8 sur 33 18.12.2007
A la fin de l assistant, un Partner Link permettant de communiquer avec notre BD, selon les informations spécifiées, est crée. 4.1.4.2.Création d un «Database Adapter» pour retrouver la pk de la livraison Avant d insérer la livraison dans notre BD, il faut aller rechercher le numéro de clé primaire de la livraison en interrogeant la séquence LIV_SEQ. Pour réaliser cela, on créer un nouveau «Database Adapter». Comme type d opération, nous sélectionnons l option Execute custom SQL et indiquons à l assistant la requête d interrogation de la séquence : Auteur : Page 9 sur 33 18.12.2007
Comme tout à l heure, un Parter Link est automatiquement crée à la fin de l assistant. 4.1.4.3.Création d un «Database Adapter» pour retrouver la PK du véhicule Même principe que précédemment mais cette fois, il s agit de donner la requête permettant de retrouver le numéro de clé primaire du véhicule dont le code est «CAM001» : Auteur : Page 10 sur 33 18.12.2007
4.1.4.4.Création du scope «InsertLivraisonIntoTransporteurDB» et de ses variables Création d un nouveau scope qui contiendra les activités pour insérer la livraison dans la BD. Création des variables «livraisonsequenceinput», «livraisonsequenceoutput», «VehiculeNumeroInput» et «LivraisonRequest» Création de la variable «livraisonsequenceinput» : Renseigner le Message Type via la sélection du Partner Link «LivraisonSequence» créer précédemment Attention, la création de la variable «livraisonsequenceoutput» doit être crée au niveau globale car cette valeur de sortie sera utilisée pour l appel du Service Web C. Auteur : Page 11 sur 33 18.12.2007
Pour la création des variables «VehiculeNumeroInput» et «VehiculeNumeroOutput», même principe que pour «livraisonsequenceinput». Création de la variable «LivraisonRequest» : 4.1.4.5.Retrouver la PK de la livraison («GetLivId» Invoque Activity) Cette activité d invocation va rechercher la valeur suivant de la séquence LIV_SEQ de la BD et la stocker dans la variable «livraisonsequenceoutput» : - Glisser-déposer une activité d invocation dans le scope «InsertLivraisonIntoTrasnporteurDB» - Réaliser une flèche entre l activité et le Database Adapter «Livraison Sequence» crée précédemment. - Entrer les informations nécessaires pour notre activité d invocation : Pour les champs Input Variable et Output Variable, sélectionner les variables réalisées précédemment : Auteur : Page 12 sur 33 18.12.2007
Résultat graphique dans BPEL : 4.1.4.6.Retrouver le numéro du véhicule («GetVehId» Invoque Activity) Même principe que pour le point précédent : Auteur : Page 13 sur 33 18.12.2007
4.1.4.7.Préparer les valeurs pour l insertion de la livraison («AssignLivraisonValues» Assign Activity) Il s agit de copier les valeurs adéquates dans les variables d entré qui seront utilisé pour le Partner Link d insertion de la livraison : Copie de la PK de la livraison (variable de résultat de l appel de la séquence) dans l élément «numero» de la variable LivraisonRequest. Copie du numéro du véhicule. Auteur : Page 14 sur 33 18.12.2007
Copie du paramètre d entré «pedemtransnum» du processus BPEL «traiter demande» dans l élément «demtransnumero» de la variable LivraisonRequest. Idem pour la date de livraison Auteur : Page 15 sur 33 18.12.2007
Copie de la chaîne de caractère PROGRAMME dans l élément «état» de la variable LivraisonRequest. 4.1.4.8.Insertion dans la table livraison («InsertLivraison» Invoke Activity) Maintenant ces copies de variables effectuées, il faut appeler le Partner Link «InsertLivraison» avec comme variable d entré LivraisonRequest : Auteur : Page 16 sur 33 18.12.2007
4.1.5. Invocation du Service Web C (WSPorductor confirmtransport) Projet BPMS Voir point 7.3 «Invoking a Web Service» de la documentation «Oracle SOA Suite Developer s Guide 10g (10.1.3.1.0)» Un service Web peut être invoqué de manière synchrone ou asynchrone. Un service web invoqué de manière synchrone fournit une réponse immédiate et bloque le processus BPEL pendant la durée de l opération. Un service web invoqué de manière asynchrone ne bloque pas le processus BPEL et peut être utile dans un environnement où un service web prend beaucoup de temps pour traiter une demande cliente. L appel asynchrone fournit donc plus de stabilité au processus dans le cas où un service web serait défaillant. L invocation au service web du producteur «confirmtransport» sera effectuée de manière synchrone. Pour pouvoir effectuer cet appel, nous devons ajouter les activités suivantes à notre processus BPEL : - Un Partner Link pour définir le service web externe avec qui le processus BPEL va interagir. - Un Scope Acrivity pour regrouper les activités en un bloque qui peuvent avoir leurs propres variables et traitement d exceptions. - Une Invoke Activity pour spécifier l opération du service web que l on désir invoquer. - Deux Assign Activities. La première pour prendre la requête cliente et contacter le service web et la deuxième pour retourner la réponse fournit par le service web. 4.1.5.1.Création du Partner Link Pointer sur le WSDL du service web producteur: E:\Assistanat\mywork\BPMSPROD3_WS\ WSProductor\public_html\WEB-INF\wsdl\ JDeveloper me propose de faire une copie de ce wsdl, ce que j accepte. Ensuite, JDeveloper propose de créer un WSDL contenant un Partner Link et qui référera au wsdl : Auteur : Page 17 sur 33 18.12.2007
Une fois ceci accepté, j ai donc deux WSDL : WSConvoyer.wsdl : WSConvoyerRef.wsdl : 4.1.5.2.Création du Scope Activity Fichier WSDL du service web. Projet BPMS Fichier WSDL généré par JDeveloper. Importe le fichier WSDL cidessus et créer le Partner Link. Glisser-déposer un Scope Activity entre l activité receiveinput et callbackclient. 4.1.5.3.Création d une Invoke Activity Nous créons automatiquement (baguette magique) les variables Input Variable et Ouput Variable. Pour réaliser cela, JDeveloper se réfère au paramètres d I/O définit pour l opération confirmtransport dans le fichier WSDL. 4.1.5.4.Créer une Assign Activity pour permettre d assigner des valeurs d entré au WS Copie du paramètre d entré «pedemtransnum» du processus BPEL «traiter demande» dans le paramètre d entré «transportrequestid» du WS WSProductor_confirmTransport. Auteur : Page 18 sur 33 18.12.2007
Copie du paramètre d entré «peidcommande» du processus BPEL «traiter demande» dans le paramètre d entré «orderid» du WS WSProductor_confirmTransport. Copie du paramètre d entré «pedatesouhaite» du processus BPEL «traiter demande» dans le paramètre d entré «deliverydate» du WS WSProductor_confirmTransport. A terme voir si on créer un WS qui retourne la date de livraison prévue en fonction de la date souhaité et? Copie de la variable globale (sortie de l interrogation de la séquence) dans le paramètre d entré «transportid» du WS WSProductor_confirmTransport. Auteur : Page 19 sur 33 18.12.2007
4.1.5.5.Créer une Assign Activity pour assigner des valeurs de retour du processus Auteur : Page 20 sur 33 18.12.2007
4.1.6. Résultat graphique Auteur : Page 21 sur 33 18.12.2007
4.2. Processus «chargement de la marchandise» Il s agit de réaliser un processus BPEL permettant: 1. De charger les lignes de livraisons selon le numéro de livraison. 2. De calculer le nombre de cartons et palettes. Projet BPMS 3. De rechercher le numéro d ID de la commande selon le numéro de la demande de transport. 4. D invoquer le Service Web F (WSProductor confirmaor) de notre partenaire producteur. 5. D invoquer le Service Web F2 (WSRetailer loadingleft) de notre partenaire détaillant. 4.2.1. Création du projet BPEL Auteur : Page 22 sur 33 18.12.2007
4.2.2. Edition de paramètres d I/O du processus BPEL (schéma XSD) Projet BPMS Définition des paramètres d entrés/sorties du processus BPEL en éditant le schéma XSD associé au WSDL du processus : 4.2.3. Recherche des lignes de livraisons Pas encore réalisé. 4.2.4. Calcul du nombre de cartons et palettes Pas encore réalisé. 4.2.5. Recherche du numéro de l id de la commande Avant d appeler les Services Web F (WSProductor confirmaor) du producteur et F2 (WSRetailer loadingleft) du détaillant, nous avons besoin d aller rechercher une information dans notre schéma. Il s agit du numéro de commande du producteur que nous trouverons en fonction du numéro de la demande de transport. J ai crée une procédure PL/SQL permettant de réaliser ce travail. C est la fonction GETIDCMDDEMTRANSNUM du package PACK_TRANS (du schéma BPMSTRANS_3). L idée est donc de pouvoir utiliser cette fonction directement depuis notre processus BPEL via un Database Adapter et, ensuite, de l invoquer via une Invoke Activity. Auteur : Page 23 sur 33 18.12.2007
4.2.5.1.Création du Database Adapter «GetCmdId» Nous indiquons la fonction sur laquelle JDeveloper va se basé pout générer le Patner Link : Auteur : Page 24 sur 33 18.12.2007
4.2.5.2.Création de l activité d invocation «Invoke_GetCmdId» La création des variables d I/O sont effectué ici, à l aide du bouton baguette magique. 4.2.5.3.Création de l activité de copie «Assign_GetCmdId_Input» Permet de copier le numéro de demande de transport reçu en tant que paramètre d entré du processus dans la variable d entré du Partner Link GetCmdId Auteur : Page 25 sur 33 18.12.2007
4.2.6. Invocation du Service Web F (WSProductor confirmaor) Projet BPMS 4.2.6.1.Création du partner link Même principe que précédemment : 4.2.6.2.Création du scope activity «ConfirmAoR» Même principe que précédemment. 4.2.6.3.Création d une Invoke Activity «Invoke_WSProductor_ConfirmAoR» Même principe que précédemment. Pour rappel, il faut spécifier le Partner Link, sélectionner la bonne opération (confimraor) et créer les variables d I/O directement à l aide de la petite baguette magique. Lors de cette création de variables, on peut choisir si on désir créer des variables globale ou locale. La création d une variable locale la créera au niveau du scope tandis que globale, au niveau du process. Pour notre cas, nous créons des variables locales. Auteur : Page 26 sur 33 18.12.2007
4.2.6.4.Assigner les valeurs d entrée du WS «Assign_Input_WSF» Même principe que précédemment, utilisation d une «Assign Activity» : Auteur : Page 27 sur 33 18.12.2007
Remarque : Pour la variable «From», si on sélectionne «ns2 :GETIDCMDDEMTRANSNUM», le processus plante à l exécution. Il faut donc sélectionner le nœud père «ns2 :OutputParameters» qui permettra, malgré le warning ci-dessous le bon fonctionnement du processus : Pour information : Dans une étape précédente, JDeveloper avait généré le Partner Link «GetCmdId» à partir d une fonction PL/SQL. En visionnant le WSDL généré, on voit que le WS crée est «attaqué» avec «jca» et non «soap». Le problème vient sans doute de cela car si le «Partner Link» est généré à partir d un service web (qui lui est généré via une fonction PL/SQL), je ne rencontre pas ce «bug». Auteur : Page 28 sur 33 18.12.2007
4.2.6.5.Création de l activité d assignation «Assign_Output_WSF» Il s agit de copier la valeur retourné par le WS F dans une variable globale à notre processus (outputvariablewsf) : Remarque : on pourrait traiter la valeur retourné par le WS F pour voir si ok Auteur : Page 29 sur 33 18.12.2007
4.2.7. Invocation du Service Web F2 (WSRetailer loadingleft) Même principe que précédemment. Création du Partner Link «WSRetailer»: Création du Scope «LoadingLeft» : Création de l appel «Invoke_WSRetailer_LoadingLeft» : Création de l élément de copie «Assign_Input_WSF2» : Remarque : Pour le moment, la variable contenant les produits et quantités est entré en «dur» Auteur : Page 30 sur 33 18.12.2007
4.2.8. Résultat graphique Auteur : Page 31 sur 33 18.12.2007
4.3. Compilation et test Pour compiler et déployer un processus BPEL : - Clique droit sur le projet (dans mon cas «BPELProcessTraiterDemande») - Deploy > BPELServer > Deploy to default domain. - Cliquer ok. - Le processus BPEL se compile. - Contrôler s il y a eut des erreurs dans la fenêtre de log, qui est située en bas dans JDeveloper. Vérifier dans les onglets «Messages» et «Apache Ant». Si nécessaire, corriger les erreurs éventuelles et redéployer. - Ouvrir la console BPEL URL : http://iasdev.ig.he-arc.ch/bpelconsole/ Usr/psw : oc4jadmin/********** - En haut à droite, accéder à «Default» - Sélectionner le processus que l on vient de déployer - Entrer les paramètres via l interface web : Auteur : Page 32 sur 33 18.12.2007
Le message SOAP de retour du processus BPEL est affiché : L outil «Flux visuel» permet de voir toutes les étapes sous forme graphique ou XML. Ceci est très utile pour débuguer les processus. Auteur : Page 33 sur 33 18.12.2007