Exemple Consommer plusieurs files d'attente avec un automate

De Wiki1000
Révision datée du 29 août 2013 à 13:47 par Syfre (discussion | contributions) (→‎Code snippet du processus de traitement)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)

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.

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 :

{{#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 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