Exemple Copie entre files d'attente

De Wiki1000
(Différences entre les versions)
(Page créée avec « __TOC__ Dans cet exemple nous allons montrer comment copier les messages d'une file d'attente à une autre en utilisant : * Une file d'attente source gérée par un serveu... »)
 
 
(3 révisions intermédiaires par un utilisateur sont masquées)
Ligne 3 : Ligne 3 :
 
* Une file d'attente source gérée par un serveur activeMQ
 
* Une file d'attente source gérée par un serveur activeMQ
 
* Une file d'attente destination stockée en base de données.
 
* Une file d'attente destination stockée en base de données.
 +
* Un automate pour exécuter une tâche de copie
  
 
===Configuration des files d'attentes===
 
===Configuration des files d'attentes===
Ligne 44 : Ligne 45 :
 
{{#images:image4.png|msgqueue/example2}}
 
{{#images:image4.png|msgqueue/example2}}
  
'''Tâche d'automate de copie :'''
+
L'évènement référence la file d'attente par son nom de paramétrage (AMQ)
  
* L'évènement référence la file d'attente par son nom de paramétrage (AMQ)
+
'''Tâche d'automate de copie :'''
  
 
{{#images:image3.png|msgqueue/example2}}
 
{{#images:image3.png|msgqueue/example2}}
Ligne 189 : Ligne 190 :
  
 
On constate que les deux services ont consommés les deux files.
 
On constate que les deux services ont consommés les deux files.
 +
 +
'''Au vue de cette log on peut se demander pourquoi les copies et les traitements ne sont pas entrelacés ?'''
 +
 +
La raison est liée à la façon dont sont exécutées les tâches :
 +
 +
Dans cet exemple :
 +
* Chaque automate n'exécute qu'une tâche à la fois
 +
* Les messages sont générés en rafale par un producteur très rapide.
 +
 +
L'exécution est réalisée ainsi :
 +
* L'évènement file d'attente se déclenche
 +
* Tant qu'il existe des messages dans la file la tâche est exécutée
 +
* Le délai de boucle du serveur d'automate est appliqué
 +
 +
Du fait qu'il existe une boucle interne "Tant qu'il existe des messages" les automates consomment la totalité des messages avant de tester l'évènement suivant.
 +
 +
Si on ralentit le producteur, par exemple avec un slip(2000) dans la boucle on constate que les exécutions vont s'entrelacer :
 +
 +
{{#images:image11.png|msgqueue/example2}}
  
 
[[Category:File d'attente]]
 
[[Category:File d'attente]]

Version actuelle en date du 29 août 2013 à 12:58

Sommaire

Dans cet exemple nous allons montrer comment copier les messages d'une file d'attente à une autre en utilisant :

  • Une file d'attente source gérée par un serveur activeMQ
  • Une file d'attente destination stockée en base de données.
  • Un automate pour exécuter une tâche de copie

Configuration des files d'attentes

La file d'attente source est configurée ainsi :

image1.png

  • Le nom de paramétrage de la file est AMQ
  • Le type de la file est ActiveMQ ce qui indique une file d'attente gérée par uns serveur ActiveMQ
  • La chaine de connexion référence le serveur ActiveMQ s'exécutant sur le serveur merlin et indique le nom de file sur ce serveur.

La file destination est configurée ainsi :

image2.png

  • Le nom de paramétrage de la file est DBQUEUE
  • Le type de la file est DatabaseMQ ce qui indique qu'il s'agit d'une file gérée en base de données
  • L'attribut QueueConnextionInfos indique le nom de la classe dans laquelle seront stockés les messages, il s'agit de la classe générique permettant de stocker n'importe quel message.

Code snippet du producteur

Le code générant le message dans la file activeMQ est le suivant :

var msg:TdbmQueueMessage; idx:Integer;
begin
  for idx:=1 to 1 do
   begin
     msg := TdbmQueueMessage.Create;
     msg.QueueName := 'AMQ';
     msg.AddParameter('uneChaine','some text');
     msg.AddParameter('unEntier',1999);
     msg.BinaryContent.LoadFromFile('c:\image.jpg');
     msg.Post;
   end;
end;

Configuration de la tâche d'automate

Evènement file d'attente :

image4.png

L'évènement référence la file d'attente par son nom de paramétrage (AMQ)

Tâche d'automate de copie :

image3.png

  • L'évènement déclencheur est un évènement file d'attente.
  • La tâche exécutée est une tâche de copie.
  • La configuration de la tâche de copie indique la file source et la file destination.
Tip-20px.png Tip : Du fait que l'évènement est du type file d'attente la configuration de la file source n'est pas utilisée

Exécution

L'exécution du code du producteur crée un message dans la file d'attente ActiveMQ :

image5.png

Démarrage de l'automate :

image6.png

On constate que l'automate est déclenchée et exécute la tâche de copie

Le message a été copié dans la file destination :

image7.png

Traitement du message copié

Pour traiter le message copié nous utilisant un second automate :

image8.png

Cet automate est déclenchée par évènement file d'attente configuré sur la file destination.

Les deux automates sont exécutés simultanément.

Exécutons :

image9.png

On constate que :

  • Le premier automate copie le message de la file source vers la file destination.
  • Le second automate consomme le message de la file destination.

Le compte rendu de la tâche d'exécution :

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 13:26:14
Fin : 11/04/2013 13:26:19
Durée : 5 s
Fichiers : 0
Statut : 0 OK

MyProcessus.Execute
Has a message
MessageClassName="TStaticRegClass"
MessageDatetime="11/04/2013"
MessageUser="syfre"
MessageOID="000000000000000000E30001A1180021"
MessageID="179"
Topic="WSMQCOPY"
State="1"
OriginalUniqueID="ID:MERLIN-49884-1359131319255-2:115:-1:1:3"
idOTP="227"
ObjectClassLabel="Classe message stocké d'une file d'attente"
ObjectClassName="TDBMSTOREDQUEUEMESSAGE"
oid="000000000000000000E30001A1180021"
oiddbmQueue=""
oidShare=""
QueueName="WSMQCOPY"
queueTopic="WSMQCOPY"
ShareInfo=""
ShareInstanceInfo=""
ShareInstanceLevel="2"
ShareInstanceRequestedLevel="-1"
ShareLevel="0"
UniqueID="179"
UpdDate="11/04/2013"
UpdStamp="00017D7A0000002D"
UpdUser="syfre"
id="ID:MERLIN-49884-1359131319255-2:115:-1:1:3"
msgDestination="/queue/queue/QUEUE1"
msgReceiptId=""
msgCorrelationId=""
msgReplyTo=""
msgType=""
msgGroupId=""
msgGroupSeq="0"
msgPriority="4"
uneChaine="some text"
unEntier="1999"
OriginalQueueName="AMQ"

La tâche d'exécution effectue un dump des paramètres de la tâche, on retrouve les valeurs des paramètres du message d'origine.

Utilisation de plusieurs consommateurs

Il est possible de démarrer plusieurs services sur le même automate pour mettre en oeuvre plusieurs consommateurs :

[\SOFTWARE\Sage\Ligne 1000\Administration\IPC\SYFRE1]
ipcMode=ipcTCP
tcpPort=8091
section=SYFRE

[\SOFTWARE\Sage\Ligne 1000\Administration\IPC\SYFRE2]
ipcMode=ipcTCP
tcpPort=8092
section=SYFRE

[\SOFTWARE\Sage\Ligne 1000\Administration\Servers\SYFRE]
Master Profil=dbMasterTahoe
Server Societies=Test SYFRE Workflow
Server Application=Test-SYFRE-WorkFlow
Server User=syfre
Server Password=
Public Folder=C:\Mes documents\Server\
IPC Started=0
BP Started=0
Automate Name=SYFRE
Automate Started=1
DEBUGGER Started=0
DEBUGGER Users=syfre,toto,titi
SESSIONS profil=CONFIG_SESSION_1
SOAP Profil=CONFIG_SOAP_1
SNMP Profil=CONFIG_SNMP_1
SMTP Profil=CONFIG_SMTP_1
PROCESS Profil=CONFIG_PROCESS_1
--HTTP Profil=CONFIG_HTTP_INTERNAL
Tip-20px.png Tip : Les services ne démarre pas de serveur HTTP

Lorsque l'on crée plusieurs messages dans la file d'attente :

image10.png

On constate que les deux services ont consommés les deux files.

Au vue de cette log on peut se demander pourquoi les copies et les traitements ne sont pas entrelacés ?

La raison est liée à la façon dont sont exécutées les tâches :

Dans cet exemple :

  • Chaque automate n'exécute qu'une tâche à la fois
  • Les messages sont générés en rafale par un producteur très rapide.

L'exécution est réalisée ainsi :

  • L'évènement file d'attente se déclenche
  • Tant qu'il existe des messages dans la file la tâche est exécutée
  • Le délai de boucle du serveur d'automate est appliqué

Du fait qu'il existe une boucle interne "Tant qu'il existe des messages" les automates consomment la totalité des messages avant de tester l'évènement suivant.

Si on ralentit le producteur, par exemple avec un slip(2000) dans la boucle on constate que les exécutions vont s'entrelacer :

image11.png

Outils personnels