Exemple Consommer plusieurs files d'attente avec un automate
De Wiki1000
(Différences entre les versions)
(Page créée avec « __TOC__ 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 al... ») |
|||
Ligne 4 : | Ligne 4 : | ||
===Configuration des files d'attente=== | ===Configuration des files d'attente=== | ||
Nous allons utiliser trois files d'attente : | Nous allons utiliser trois files d'attente : | ||
− | * Une file d'attente sur topic1 | + | * Une file d'attente DBQUEUE1 sur topic1 utilisée par le producteur |
− | * Une file d'attente sur topic2 | + | * Une file d'attente DBQUEUE2 sur topic2 utilisée par le producteur |
− | * Une file d'attente sur topic% | + | * 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. | + | {{#images:image2.png|msgqueue/example4}} |
+ | |||
+ | {{#images:image3.png|msgqueue/example4}} | ||
+ | |||
+ | {{#images:image1.png|msgqueue/example4}} | ||
+ | |||
+ | L'utilisation du caractère joker % permet de consommer tous les messages de sujet correspondant. | ||
===Configuration de l'automate=== | ===Configuration de l'automate=== | ||
+ | '''Evènements :''' | ||
+ | |||
+ | {{#images:image5.png|msgqueue/example4}} | ||
+ | |||
+ | L'évènement file d'attente utilise la file DBQUEUELIKE pour consommer à la fois les messages produits sur DBQUEUE1 et DBQUEUE2 | ||
+ | |||
+ | '''Automate :''' | ||
+ | |||
+ | {{#images:image4.png|msgqueue/example4}} | ||
===Code snippet du processus de traitement=== | ===Code snippet du processus de traitement=== | ||
+ | |||
+ | <source lang="delphi"> | ||
+ | //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; | ||
+ | </source> | ||
+ | |||
+ | Le code test le sujet du message pour exécuter des traitements différent suivant les cas. | ||
===Exécution=== | ===Exécution=== | ||
+ | |||
+ | Traitement sur un message de DBQUEUE1 : | ||
+ | |||
+ | <pre> | ||
+ | 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 | ||
+ | </pre> | ||
+ | |||
+ | |||
+ | Traitement sur un message de DBQUEUE2 : | ||
+ | |||
+ | <pre> | ||
+ | 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 | ||
+ | </pre> | ||
[[Category:File d'attente]] | [[Category:File d'attente]] |
Version du 12 avril 2013 à 08:40
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.
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 test le sujet du message pour exécuter des traitements différent suivant les cas.
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
Whos here now: Members 0 Guests 0 Bots & Crawlers 1 |