« Exemple Consommer plusieurs files d'attente avec un automate » : différence entre les versions

De Wiki1000
(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 utilisé par le producteur
* Une file d'attente DBQUEUE1 sur topic1 utilisée par le producteur
* Une file d'attente sur topic2 utilisé par le producteur
* Une file d'attente DBQUEUE2 sur topic2 utilisée par le producteur
* Une file d'attente sur topic% utilisé par le consommateur
* 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