Pré. | Proc. |
Exemple : Motif d'événement différé
Enterprise Architect supporte le Motif d'événement différé.
Pour créer un événement différé dans un State :
- Créer une transition autonome pour l' State .
- Changez le 'type' de la transition en 'interne'.
- Spécifiez le déclencheur comme étant l'événement que vous souhaitez différer.
- Dans le champ 'Effet', tapez 'defer();'.
- Sélectionnez 'Simuler > Simulation Dynamique > Simulateur > Ouvrir la fenêtre de Simulation '. Sélectionnez également 'Simuler > Simulation Dynamique > Événements ' pour ouvrir la fenêtre Simulation Événements .
- La fenêtre Événements du simulateur vous aide à déclencher des événements ; double-cliquez sur un déclencheur dans la colonne ' Déclencheurs en Attente '.
- La fenêtre Simulation affiche l'exécution sous forme de texte. Vous pouvez taper "dump" dans la ligne de commande du simulateur pour afficher le nombre d'événements différés dans la file d'attente ; la sortie pourrait ressembler à ceci :
24850060] Groupe d'événements : [NOUVEAU, NOUVEAU, NOUVEAU, NOUVEAU, NOUVEAU,]
Exemple d'événement différé
Cet exemple montre un modèle utilisant des événements différés et la fenêtre Événements de Simulation affichant tous les Événements Événements .
Nous mettons d'abord en place les contextes (les éléments Class contenant les Statemachines ), les simulons dans un contexte simple et élevons l'événement de l'extérieur ; puis simulez dans un contexte client-serveur avec le mécanisme d'événement Envoyer.
Créer un contexte et Statemachine
Créer le contexte du serveur
Créez un diagramme de classes et :
- Un élément de classe TransactionServer , auquel vous ajoutez un Statemachine ServerStateMachine .
- Un élément Class TestClient , auquel vous ajoutez un Statemachine ClientStateMachine .
- Une association de TestClient à TransactionServer , avec le rôle cible nommé server.
Modélisation pour ServerStateMachine
- Ajoutez un Initial Node Initial au diagramme Statemachine et passez à un State idle .
- Transition (avec événement NEW_REQUEST comme Trigger) vers un State busy .
- Transition (avec l'événement QUIT comme déclencheur) vers un State final Final.
- Transition (avec l'événement AUTHORIZED comme Trigger) vers idle .
- Transition (avec l'événement NEW_REQUEST comme Trigger et defer (); comme effet) vers occupé
Modélisation pour ClientStateMachine
- Ajoutez un Initial Node Initial au diagramme Statemachine et passez à un State State0 .
- Transition (avec l'événement RUN_TEST comme déclencheur) vers un State State1 .
- Transition (avec effet : %SEND_EVENT("NEW_REQUEST", CONTEXT_REF(server))%;) vers un State State2.
- Transition (avec effet : %SEND_EVENT("NEW_REQUEST", CONTEXT_REF(server))%;) vers un State State3 .
- Transition (avec effet : %BROADCAST_EVENT("NEW_REQUEST")%;) vers un State State4 .
- Transition (avec effet : %SEND_EVENT("AUTHORIZED", CONTEXT_REF(server))%;) vers un State State5 .
- Transition vers un State final final.
Simulation dans un contexte simple
Créer l'artefact de Simulation
- Créez un artefact Statemachine Exécutable avec le nom Simulation with Deferred Event et le champ 'Language' défini sur JavaScript .
- Agrandissez-le, puis + faites glisser l'élément TransactionServer sur l'artefact et collez-le en tant que propriété avec le serveur de noms.
Exécuter la Simulation
- Sélectionnez l'Artefact, puis sélectionnez l' Statemachine États Exécutables Générer , Build et Exécuter ', et spécifiez un répertoire pour votre code ( Note : tous les fichiers du répertoire seront supprimés avant le démarrage de la simulation).
- Cliquez sur le bouton Générer .
- Sélectionnez l'option 'Simuler > Simulation Dynamique > Événements ' pour ouvrir la fenêtre Simulation Evénement.
Lorsque la simulation démarre, l'état inactif sera l'état actif.
- Double-cliquez sur NEW_REQUEST dans la fenêtre Simulation Event pour l'exécuter en tant que déclencheur ; inactif est quitté et occupé est activé.
- Double-cliquez sur NEW_REQUEST dans la fenêtre Simulation Event pour l'exécuter à nouveau en tant que déclencheur ; occupé reste activé et une instance de NEW_REQUEST est ajoutée au pool d'événements.
- Double-cliquez sur NEW_REQUEST dans la fenêtre Simulation Event pour l'exécuter une troisième fois en tant que déclencheur ; occupé reste activé et une instance de NEW_REQUEST est ajoutée au pool d'événements.
- Type dump dans la ligne de commande de la fenêtre Simulation ; notez que le pool d'événements a deux instances de NEW_REQUEST.
- Double-cliquez sur AUTORISÉ dans la fenêtre Événement de Simulation pour l'exécuter en tant que déclencheur ; ces actions ont lieu :
- occupé est quitté et inactif devient actif
- un événement NEW_REQUEST est extrait du pool, inactif est quitté et occupé devient actif - Type dump dans la ligne de commande de la fenêtre Simulation ; il n'y a maintenant qu'une seule instance de NEW_REQUEST dans le pool d'événements.
Simulation interactive via Send/Broadcast Event
Créer l'artefact de Simulation
- Créez un Statemachine Exécutable Artifact avec le nom Interactive Simulation with Deferred Event et le champ 'Language' défini sur JavaScript ; agrandir l'élément.
- + faites glisser l'élément TransactionServer sur l'artefact et collez-le en tant que propriété avec le serveur de noms.
- Ctrl + faites glisser l'élément TestClient sur l'artefact et collez-le en tant que propriété avec le nom client .
- Créez un connecteur du client au serveur .
- Cliquez sur le connecteur et appuyez sur pour sélectionner l'association de l'élément TestClient à l'élément TransactionServer .
Exécuter interactive de l' Simulation
- Lancez la simulation de la même manière que pour le contexte simple.
Une fois la simulation lancée, le client reste à State0 et le serveur reste à idle .
- Double-cliquez sur RUN_TEST dans la fenêtre Simulation Event pour le déclencher. L'événement NEW_REQUEST sera déclenché trois fois (par SEND_EVENT et BROADCAST_EVENT) et AUTHORIZED sera déclenché une fois par SEND_EVENT.
Type dump dans la ligne de commande de la fenêtre de Simulation . Il reste une instance de NEW_REQUEST dans le pool d'événements. Le résultat correspond à notre test de déclenchement manuel.