Cilia/Workshop/TP2

From Wiki Adele Team
Jump to: navigation, search

L'objectif de ce deuxième TP est de vous familiariser avec les concepts de Cilia, en manipulant une simple chaîne de médiation. cette manipulation sera effectuée en plusieurs étapes.

Un médiateur Hello world

Dans cette partie, on va créer un médiateur qui ajoute à chaque texte d'entrée le mot Hello, en début. Ce type de médiateur est déjà implémenté et disponible pour une utilisation directe. Nous allons créer une chaîne de médiation constituée de ce médiateur avec les connexions suivantes :

  • En entrée, le médiateur est connecté à une console graphique qui assure la saisie du texte d'entrée.
  • En sortie, le médiateur est connecté à une console textuelle qui affiche le résultat du traitement.

Hellomediator1.png

Cette chaîne de médiation est décrite en syntaxe XML comme suit :

tp2_1.dscilia

<cilia>
  <chain id="chain_tp2_1">
    <mediators>
      <mediator-instance id="hello" type="hello-mediator"/>
    </mediators>
    <bindings>
      <binding to="hello"   protocol="gui-console"/>
      <binding from="hello" protocol="console"/>
    </bindings>
  </chain>
</cilia>

Pour lancer cette chaîne, il suffit de la mettre dans un fichier avec une extension .dscilia (par exemple tp2_1.dscilia), et de copier ce dernier dans le répertoire load de la plateforme d'exécution.

Une fois la chaîne instanciée, une fenêtre graphique apparait invitant l'utilisateur à saisir le texte d'entré. Une fois le traitement effectué le texte de sortie est envoyé dans le terminal.

Cws tp1 1.png

Liaisons inter-médiateurs et avec les systèmes externes

Dans cette deuxième partie, nous allons manipuler les types de liaison inter-médiateurs et les liaisons avec les systèmes externes.

Nous repartons de l'exemple précédent en ajoutant un médiateur d'encryptage des données après le traitement fourni par le médiateur hello-mediator. Ensuite, les données cryptées sont envoyées à la console.

Pour cela, il suffit de ré-architecturer la chaine de médiation afin de prendre en compte ce changement.

i Le bundle qui contient le type "médiateur de cryptage" est déjà déployé dans la plateforme d'exécution fourni dans le TP1


Hellomediator2.png

tp2_2.dscilia

<cilia>
  <chain id="chain_tp2_2">
    <mediators>
      <mediator-instance id="hello" type="hello-mediator"/>
      <mediator-instance id="encryptor" type="encryptor"/>
    </mediators>
    <bindings>
      <binding to="hello"                  protocol="gui-console"/>
      <binding from="hello" to="encryptor" protocol="direct" />
      <binding from="encryptor"            protocol="console" />
    </bindings>
  </chain>
</cilia>

Nous utilisons une liaison directe entre les médiateur hello et encryptor. D'autre types de liaison Bindings sont disponibles (voir Components List). Ces liaisons sont de trois types :

  • Entrée dans la chaîne : relie un système externe à la chaîne de médiation.
  • Inter-médiateurs : relie deux médiateurs entre eux en utilisant un protocole particilier.
  • Sortie de la chaîne : renvoie le résultat de la chaîne à un système externe.

? Modifier la liaison direct par une liaison event et assurer que le message crypté arrive toujours à destination. Ensuite, modifier la chaine pour qu'elle renvoie le résultat (message crypté) par mail (utiliser le binding email. Consulter la liste des composants pour les propriétés de configuration).

tp2_2_sol.dscilia


Les capacités des médiateurs Cilia

Dans cette troisième partie, nous allons voir les différentes capacités des médiateurs Cilia, et plus particulièrement, l'architecture interne et son influence sur le comportement d'une instance du médiateur.

Nous étendons la précédente chaîne de médiation en introduisant un troisième médiateur de type decryptor comme suit :

Hellomediator3.png

Le rôle de ce médiateur est de décrypter le message crypté par le médiateur encryptor. Cette nouvelle chaîne est décrite comme suit :

tp2_3.dscilia

<cilia>
  <chain id="chain_tp2_3">
    <mediators>
      <mediator-instance id="hello" type="hello-mediator"/>
      <mediator-instance id="encryptor" type="encryptor"/>
      <mediator-instance id="decryptor" type="decryptor">
        <scheduler>
          <property name="count">
              <item key="max" value="(data.name=*)"/>
          </property> 
          <property name="condition" value="(max=3)"/>
        </scheduler>
      </mediator-instance>
    </mediators>
    <bindings>
      <binding to="hello" protocol="gui-console"/>
      <binding from="hello" to="encryptor"/>
      <binding from="encryptor" to="decryptor"/>
      <binding from="encryptor" protocol="console">
        <property name="console.header" value="ENCRYPTOR.OUT:"/>
      </binding>
      <binding from="decryptor" protocol="console">
        <property name="console.header" value="DECRYPTOR.OUT:"/>
      </binding>
    </bindings>
  </chain>
</cilia>

Deux principales remarques à retenir de cette nouvelle chaîne :

  • Le médiateur encryptor peut envoyer une copie de son résultat de cryptage à plusieurs destinataires.
  • Le médiateur decryptor ne traite pas les données reçues une par une, mais par bloc de 3.

En effet, chaque "type" de médiateur est défini par trois parties essentielles :

  • Processor : c'est le coeur métier du médiateur. Les traitements sur les données sont effectués ici.
  • Scheduler : il organise les données en entrée du médiateur.
  • Dispatcher : il organise la façon d'envoyer les données en sortie du médiateur.

Dans l'exemple ci-dessus, le médiateur encryptor utilise un dispatcher de type multicast-dispatcher qui, comme son nom l'indique, dispatche une copie du résultat de traitement du processeur à tous les destinataires. Le médiateur decryptor utilise un scheduler de type counter-scheduler qui ne lance le traitement une fois qu'un nombre défini de données ont été collectées pour le médiateur.

L'utilisateur pourra surcharger les propriétés de configuration de ces composants internes pour modifier le comportement du médiateur.


Dans le TP suivant, nous allons voir comment implémenter un médiateur spécifique.