Exemple Copie entre files d'attente
Sommaire |
Dans cet exemple nous allons montrer comment copier les messages d'une file d'attente à une autre en utilisant :
- Une file d'attente source gérée par un serveur activeMQ
- Une file d'attente destination stockée en base de données.
- Un automate pour exécuter une tâche de copie
Configuration des files d'attentes
La file d'attente source est configurée ainsi :
- Le nom de paramétrage de la file est AMQ
- Le type de la file est ActiveMQ ce qui indique une file d'attente gérée par uns serveur ActiveMQ
- La chaine de connexion référence le serveur ActiveMQ s'exécutant sur le serveur merlin et indique le nom de file sur ce serveur.
La file destination est configurée ainsi :
- Le nom de paramétrage de la file est DBQUEUE
- Le type de la file est DatabaseMQ ce qui indique qu'il s'agit d'une file gérée en base de données
- L'attribut QueueConnextionInfos indique le nom de la classe dans laquelle seront stockés les messages, il s'agit de la classe générique permettant de stocker n'importe quel message.
Code snippet du producteur
Le code générant le message dans la file activeMQ est le suivant :
var msg:TdbmQueueMessage; idx:Integer; begin for idx:=1 to 1 do begin msg := TdbmQueueMessage.Create; msg.QueueName := 'AMQ'; msg.AddParameter('uneChaine','some text'); msg.AddParameter('unEntier',1999); msg.BinaryContent.LoadFromFile('c:\image.jpg'); msg.Post; end; end;
Configuration de la tâche d'automate
Evènement file d'attente :
L'évènement référence la file d'attente par son nom de paramétrage (AMQ)
Tâche d'automate de copie :
- L'évènement déclencheur est un évènement file d'attente.
- La tâche exécutée est une tâche de copie.
- La configuration de la tâche de copie indique la file source et la file destination.
Tip : Du fait que l'évènement est du type file d'attente la configuration de la file source n'est pas utilisée |
Exécution
L'exécution du code du producteur crée un message dans la file d'attente ActiveMQ :
Démarrage de l'automate :
On constate que l'automate est déclenchée et exécute la tâche de copie
Le message a été copié dans la file destination :
Traitement du message copié
Pour traiter le message copié nous utilisant un second automate :
Cet automate est déclenchée par évènement file d'attente configuré sur la file destination.
Les deux automates sont exécutés simultanément.
Exécutons :
On constate que :
- Le premier automate copie le message de la file source vers la file destination.
- Le second automate consomme le message de la file destination.
Le compte rendu de la tâche d'exécution :
Tâche : Tâche de traitement testprocessusautomate Société : Test SYFRE Workflow Utilisateur: syfre Base(s) : TestWorkFlowdup_7 Mode Soc. : Enchaîner sur ces sociétés Société(s) : Début : 11/04/2013 13:26:14 Fin : 11/04/2013 13:26:19 Durée : 5 s Fichiers : 0 Statut : 0 OK MyProcessus.Execute Has a message MessageClassName="TStaticRegClass" MessageDatetime="11/04/2013" MessageUser="syfre" MessageOID="000000000000000000E30001A1180021" MessageID="179" Topic="WSMQCOPY" State="1" OriginalUniqueID="ID:MERLIN-49884-1359131319255-2:115:-1:1:3" idOTP="227" ObjectClassLabel="Classe message stocké d'une file d'attente" ObjectClassName="TDBMSTOREDQUEUEMESSAGE" oid="000000000000000000E30001A1180021" oiddbmQueue="" oidShare="" QueueName="WSMQCOPY" queueTopic="WSMQCOPY" ShareInfo="" ShareInstanceInfo="" ShareInstanceLevel="2" ShareInstanceRequestedLevel="-1" ShareLevel="0" UniqueID="179" UpdDate="11/04/2013" UpdStamp="00017D7A0000002D" UpdUser="syfre" id="ID:MERLIN-49884-1359131319255-2:115:-1:1:3" msgDestination="/queue/queue/QUEUE1" msgReceiptId="" msgCorrelationId="" msgReplyTo="" msgType="" msgGroupId="" msgGroupSeq="0" msgPriority="4" uneChaine="some text" unEntier="1999" OriginalQueueName="AMQ"
La tâche d'exécution effectue un dump des paramètres de la tâche, on retrouve les valeurs des paramètres du message d'origine.
Utilisation de plusieurs consommateurs
Il est possible de démarrer plusieurs services sur le même automate pour mettre en oeuvre plusieurs consommateurs :
[\SOFTWARE\Sage\Ligne 1000\Administration\IPC\SYFRE1] ipcMode=ipcTCP tcpPort=8091 section=SYFRE [\SOFTWARE\Sage\Ligne 1000\Administration\IPC\SYFRE2] ipcMode=ipcTCP tcpPort=8092 section=SYFRE [\SOFTWARE\Sage\Ligne 1000\Administration\Servers\SYFRE] Master Profil=dbMasterTahoe Server Societies=Test SYFRE Workflow Server Application=Test-SYFRE-WorkFlow Server User=syfre Server Password= Public Folder=C:\Mes documents\Server\ IPC Started=0 BP Started=0 Automate Name=SYFRE Automate Started=1 DEBUGGER Started=0 DEBUGGER Users=syfre,toto,titi SESSIONS profil=CONFIG_SESSION_1 SOAP Profil=CONFIG_SOAP_1 SNMP Profil=CONFIG_SNMP_1 SMTP Profil=CONFIG_SMTP_1 PROCESS Profil=CONFIG_PROCESS_1 --HTTP Profil=CONFIG_HTTP_INTERNAL
Lorsque l'on crée plusieurs messages dans la file d'attente :
On constate que les deux services ont consommés les deux files.
Au vue de cette log on peut se demander pourquoi les copies et les traitements ne sont pas entrelacés ?
La raison est liée à la façon dont sont exécutées les tâches :
Dans cet exemple :
- Chaque automate n'exécute qu'une tâche à la fois
- Les messages sont générés en rafale par un producteur très rapide.
L'exécution est réalisée ainsi :
- L'évènement file d'attente se déclenche
- Tant qu'il existe des messages dans la file la tâche est exécutée
- Le délai de boucle du serveur d'automate est appliqué
Du fait qu'il existe une boucle interne "Tant qu'il existe des messages" les automates consomment la totalité des messages avant de tester l'évènement suivant.
Si on ralentit le producteur, par exemple avec un slip(2000) dans la boucle on constate que les exécutions vont s'entrelacer :