Exemple Consommer plusieurs files d'attente avec un automate
De Wiki1000
Sommaire |
Dans cet exemple nous allons montrer comment consommer plusieurs files d'attente avec une seule tâche d'automate.
Configuration des files d'attente
Nous allons utiliser trois files d'attente :
- Une file d'attente DBQUEUE1 sur topic1 utilisée par le producteur
- Une file d'attente DBQUEUE2 sur topic2 utilisée par le producteur
- Une file d'attente DBQUEUELIKE sur topic% utilisée par le consommateur
L'utilisation du caractère joker % permet de consommer tous les messages de sujet correspondant.
La file d'attente DBQUEUELIKE va donc permettre de consommer les messages produits sur les files d'attente DBQUEUE1 et DBQUEUE2
Configuration de l'automate
Evènements :
L'évènement file d'attente utilise la file DBQUEUELIKE pour consommer à la fois les messages produits sur DBQUEUE1 et DBQUEUE2
Automate :
Code snippet du processus de traitement
//Procedure Execute; var aMsg:TdbmQueueMessage; aTopic:string; idx:Integer; begin if Assigned(UserContext.TaskContext) then begin UserContext.TaskContext.AddMessage('MyProcessus.Execute'); if Assigned(UserContext.TaskContext.EventContext.receivedMsg) then begin aMsg := UserContext.TaskContext.EventContext.receivedMsg; UserContext.TaskContext.AddMessage('Has a message'); for idx:=0 to aMsg.Count-1 do begin UserContext.TaskContext.AddMessage(aMsg.DisplayStrings[idx]); end; // simulate job // Branch on topic value aTopic := aMsg.PropAsVariant['Topic']; case aTopic of 'topic1': begin UserContext.TaskContext.AddMessage('Execute code for topic1'); sleep(5000); end; 'topic2': begin UserContext.TaskContext.AddMessage('Execute code for topic2'); sleep(5000); end; else begin UserContext.TaskContext.AddMessage('Execute code for :'+aTopic); sleep(1000); end; end; end else UserContext.TaskContext.AddMessage('No message'); end else showMessage('not in a task'); end;
Le code peut tester le sujet du message pour exécuter des traitements différents suivant l'origine du message.
Exécution
Traitement sur un message de DBQUEUE1 :
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 17:17:34 Fin : 11/04/2013 17:17:39 Durée : 4 s Fichiers : 0 Statut : 0 OK MyProcessus.Execute Has a message MessageClassName="TStaticRegClass" MessageDatetime="11/04/2013" MessageUser="syfre" MessageOID="000000000000000000E30001A112001C" MessageID="198" Topic="topic1" State="1" OriginalUniqueID="" idOTP="227" ObjectClassLabel="Classe message stocké d'une file d'attente" ObjectClassName="TDBMSTOREDQUEUEMESSAGE" oid="000000000000000000E30001A112001C" oiddbmQueue="" oidShare="" QueueName="topic1" queueTopic="topic1" ShareInfo="" ShareInstanceInfo="" ShareInstanceLevel="2" ShareInstanceRequestedLevel="-1" ShareLevel="0" UniqueID="198" UpdDate="11/04/2013" UpdStamp="00017D7400000039" UpdUser="syfre" uneChaine="some text" unEntier="1999" Execute code for topic1
Traitement sur un message de DBQUEUE2 :
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 17:18:05 Fin : 11/04/2013 17:18:10 Durée : 4 s Fichiers : 0 Statut : 0 OK MyProcessus.Execute Has a message MessageClassName="TStaticRegClass" MessageDatetime="11/04/2013" MessageUser="syfre" MessageOID="000000000000000000E30001A112001D" MessageID="199" Topic="topic2" State="1" OriginalUniqueID="" idOTP="227" ObjectClassLabel="Classe message stocké d'une file d'attente" ObjectClassName="TDBMSTOREDQUEUEMESSAGE" oid="000000000000000000E30001A112001D" oiddbmQueue="" oidShare="" QueueName="topic2" queueTopic="topic2" ShareInfo="" ShareInstanceInfo="" ShareInstanceLevel="2" ShareInstanceRequestedLevel="-1" ShareLevel="0" UniqueID="199" UpdDate="11/04/2013" UpdStamp="00017D740000003A" UpdUser="syfre" uneChaine="some text" unEntier="1999" Execute code for topic2