« Exemple Consommer plusieurs files d'attente avec un automate » : différence 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... ») |
Aucun résumé des modifications |
||
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 à 06:40
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
{{#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
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
<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
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