Exemple Workflow avec un automate

De Wiki1000
(Différences entre les versions)
(Page créée avec « __NOTOC__ Dans cet exemple nous allons montrer comment utiliser des files d'attente et un automate pour créer un workflow sur un objet métier. Le workflow réalise les ... »)
 
Ligne 13 : Ligne 13 :
 
* Une classe d'évènement métier définit sur $queue1.class.WFClasseA.create_or_change.unCode
 
* Une classe d'évènement métier définit sur $queue1.class.WFClasseA.create_or_change.unCode
 
* Une classe d'évènement métier définit sur $queue3.class.WFClasseA.change.Etat
 
* Une classe d'évènement métier définit sur $queue3.class.WFClasseA.change.Etat
 +
* Une classe file d'attente, en l’occurrence la classe des évènements
 
* Une file d'attente WFCLASSEA_QUEUE1
 
* Une file d'attente WFCLASSEA_QUEUE1
 
* Une file d'attente WFCLASSEA_QUEUE3
 
* Une file d'attente WFCLASSEA_QUEUE3
Ligne 18 : Ligne 19 :
 
* Un Automate
 
* Un Automate
  
===Définition des évènements===
+
===Définition des classes d'évènements===
 +
Les classe d'évènements sont les mêmes que celles utilisées dans un processus métier :
 +
 
 +
{{#images:image1.png|msgqueue/example5}}
 +
 
 +
Lorsque les conditions de ces évènements seront remplies le framework créera automatiquement des objets dans [[TdbmEvent (class)|la classe des évènements]].
 +
 
 +
Cette classe étant un classe file d'attente ces objets peuvent être consommés par des files d'attente.
 +
 
 
===Définition des files d'attente===
 
===Définition des files d'attente===
 +
Le sujet (queueTopic) des objets sera l'identifiant de queue des classes d'évènement en l'occurrence "queue1" et "queue3".
 +
 +
Des files d'attente sont donc définies sur ces sujets :
 +
 +
{{#images:image2.png|msgqueue/example5}}
 +
 +
Notez :
 +
* TdbmEvent est la classe des évènements
 +
* queue1 est le sujet de la première classe d'évènements.
 +
 +
La seconde file est définie de façon identique.
 +
 
===Définition de l'Automate===
 
===Définition de l'Automate===
 +
Un automate est utilisé pour consommer les files d'attente :
 +
 +
{{#images:image3.png|msgqueue/example5}}
 +
 +
Notez :
 +
* Les évènements files d'attente définis sur WFCLASSEA_QUEUE1 et WFCLASSEA_QUEUE3
 +
* Un seul automate est utilisé contenant deux lignes. Les lignes étant dans l'état 0 elles sont toutes les deux exécutées.
 +
* Chaque tâche de traitement appelle le même processus MyProcessusWFClasseA
 +
 +
===Le processus===
 +
Le processus d'exécution est le suivant :
 +
 +
<source lang="delphi">
 +
unit TestSYFREWF;
 +
interface
 +
 +
Type
 +
  MyProcessusWFClasseA = Class(TitObject)
 +
  public
 +
    Procedure doSetFinalState(obj:TQueueObject);
 +
    Procedure doSetInitialState(obj:TQueueObject);
 +
    Procedure Execute;
 +
  end;
 +
 +
Implementation
 +
 +
{MyProcessusWFClasseA}
 +
 +
Procedure MyProcessusWFClasseA.doSetFinalState(obj:TQueueObject);
 +
//Procedure doSetFinalState(obj:TQueueObject);
 +
var inst:WFClasseA;
 +
begin
 +
  // One transaction by object
 +
  withP transaction do
 +
  begin
 +
    // Get the actual object
 +
    inst := obj.queueRef as WFClasseA;
 +
    if Assigned(inst) then
 +
      begin
 +
        inst.unEtat.value := WFCAState_Final;
 +
      end;
 +
  end;
 +
end;;
 +
 +
Procedure MyProcessusWFClasseA.doSetInitialState(obj:TQueueObject);
 +
//Procedure doChangeState(obj:TQueueObject);
 +
var inst:WFClasseA;
 +
begin
 +
  // One transaction by object
 +
  withP transaction do
 +
  begin
 +
    // Get the actual object
 +
    inst := obj.queueRef as WFClasseA;
 +
    if Assigned(inst) then
 +
      begin
 +
        inst.unEtat.value := WFCAState_Initial;
 +
      end;
 +
  end;
 +
end;
 +
 +
Procedure MyProcessusWFClasseA.Execute;
 +
//Procedure Execute;
 +
var aMsg:TdbmQueueMessage;
 +
begin
 +
  if Assigned(UserContext.TaskContext) then
 +
  begin
 +
    UserContext.TaskContext.AddMessage('MyProcessusWFClasseA.Execute');
 +
    if Assigned(UserContext.TaskContext.EventContext.receivedMsg) then
 +
      begin
 +
        aMsg := UserContext.TaskContext.EventContext.receivedMsg;
 +
        UserContext.TaskContext.AddMessage(Format('Object :%s',[aMsg.oidqueueRef]]);
 +
        UserContext.TaskContext.AddMessage(Format('QueueTopic :%s',[aMsg.queueTopic]]);
 +
        case aMsg.queueTopic of
 +
          'queue1': doSetInitialState(aMsg);
 +
          'queue3': doSetFinalState(aMsg);
 +
        end;
 +
      end;
 +
  end;
 +
end;
 +
 +
end.
 +
</source>
 +
 +
La méthode "Exceute", exécutée par les tâche d'automate, extrait le message du contexte de tâche de l'automate puis suivant la valeur du sujet du message exécute l'une ou l'autre des actions.
 +
 +
 +
 
===Exécution===
 
===Exécution===
  
 
[[Category:File d'attente]]
 
[[Category:File d'attente]]

Version du 30 avril 2013 à 15:08

Dans cet exemple nous allons montrer comment utiliser des files d'attente et un automate pour créer un workflow sur un objet métier.

Le workflow réalise les actions suivantes :

  • Lorsque un objet est créé ou bien que l'attribut "unCode" est modifié sur la classe WFClasseA un processus est appelé qui modifie la valeur de l'énuméré unEtat de l'objet à "Initial".
  • Lorsque la valeur de l'état de l'objet (unEtat) est modifié un processus est appelé qui modifie la valeur de l'état de l'objet à finale.

Ce workflow est la base des interactions entre Processus métiers et objets métiers.

Pour ce faire nous utiliserons :

  • La classe métier WFClasseA
  • Une classe d'évènement métier définit sur $queue1.class.WFClasseA.create_or_change.unCode
  • Une classe d'évènement métier définit sur $queue3.class.WFClasseA.change.Etat
  • Une classe file d'attente, en l’occurrence la classe des évènements
  • Une file d'attente WFCLASSEA_QUEUE1
  • Une file d'attente WFCLASSEA_QUEUE3
  • Un processus métier définit par la classe MyProcessusWFClasseA
  • Un Automate

Définition des classes d'évènements

Les classe d'évènements sont les mêmes que celles utilisées dans un processus métier :

image1.png

Lorsque les conditions de ces évènements seront remplies le framework créera automatiquement des objets dans la classe des évènements.

Cette classe étant un classe file d'attente ces objets peuvent être consommés par des files d'attente.

Définition des files d'attente

Le sujet (queueTopic) des objets sera l'identifiant de queue des classes d'évènement en l'occurrence "queue1" et "queue3".

Des files d'attente sont donc définies sur ces sujets :

image2.png

Notez :

  • TdbmEvent est la classe des évènements
  • queue1 est le sujet de la première classe d'évènements.

La seconde file est définie de façon identique.

Définition de l'Automate

Un automate est utilisé pour consommer les files d'attente :

image3.png

Notez :

  • Les évènements files d'attente définis sur WFCLASSEA_QUEUE1 et WFCLASSEA_QUEUE3
  • Un seul automate est utilisé contenant deux lignes. Les lignes étant dans l'état 0 elles sont toutes les deux exécutées.
  • Chaque tâche de traitement appelle le même processus MyProcessusWFClasseA

Le processus

Le processus d'exécution est le suivant :

unit TestSYFREWF;
interface
 
Type
  MyProcessusWFClasseA = Class(TitObject)
  public
    Procedure doSetFinalState(obj:TQueueObject);
    Procedure doSetInitialState(obj:TQueueObject);
    Procedure Execute;
  end;
 
Implementation
 
{MyProcessusWFClasseA}
 
Procedure MyProcessusWFClasseA.doSetFinalState(obj:TQueueObject);
//Procedure doSetFinalState(obj:TQueueObject);
var inst:WFClasseA;
begin
  // One transaction by object
  withP transaction do
   begin
     // Get the actual object
     inst := obj.queueRef as WFClasseA;
     if Assigned(inst) then
      begin
        inst.unEtat.value := WFCAState_Final;
      end;
   end;
end;;
 
Procedure MyProcessusWFClasseA.doSetInitialState(obj:TQueueObject);
//Procedure doChangeState(obj:TQueueObject);
var inst:WFClasseA;
begin
  // One transaction by object
  withP transaction do
   begin
     // Get the actual object
     inst := obj.queueRef as WFClasseA;
     if Assigned(inst) then
      begin
        inst.unEtat.value := WFCAState_Initial;
      end;
   end;
end;
 
Procedure MyProcessusWFClasseA.Execute;
//Procedure Execute;
var aMsg:TdbmQueueMessage;
begin
  if Assigned(UserContext.TaskContext) then
   begin
     UserContext.TaskContext.AddMessage('MyProcessusWFClasseA.Execute');
     if Assigned(UserContext.TaskContext.EventContext.receivedMsg) then
       begin
         aMsg := UserContext.TaskContext.EventContext.receivedMsg;
         UserContext.TaskContext.AddMessage(Format('Object :%s',[aMsg.oidqueueRef]]);
         UserContext.TaskContext.AddMessage(Format('QueueTopic :%s',[aMsg.queueTopic]]);
         case aMsg.queueTopic of
          'queue1': doSetInitialState(aMsg);
          'queue3': doSetFinalState(aMsg);
         end;
       end;
   end;
end;
 
end.

La méthode "Exceute", exécutée par les tâche d'automate, extrait le message du contexte de tâche de l'automate puis suivant la valeur du sujet du message exécute l'une ou l'autre des actions.


Exécution

Outils personnels