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

image2.png

image3.png

image1.png

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 :

image5.png

L'évènement file d'attente utilise la file DBQUEUELIKE pour consommer à la fois les messages produits sur DBQUEUE1 et DBQUEUE2

Automate :

image4.png

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
Outils personnels