IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Workflow Foundation .NET Discussion :

Gestion des événements HandleExternalEventActivity


Sujet :

Windows Workflow Foundation .NET

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2007
    Messages : 180
    Points : 198
    Points
    198
    Par défaut Gestion des événements HandleExternalEventActivity
    Salut à tous,

    voici mon problème:
    Je lance une instance dans laquelle j'ai plusieurs activités Listen qui se suivent.
    Pour simplifier, disons que j'ai 2 niveaux, avec une boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    While (bool)
    {
    Listen(2evts)
    ... Activity suivant l'événement pour la branche 1
    ... Activity, puis Listen pour la branche 2.
    }
    Je suis dans l'attente sur le 1er listen. Lors de cette attente, je reçois un événement traité par le second listen (branche 2).
    Je reçois l'événement pour la branche 2, les activités se font, puis mon instance arrive sur le Listen (et là...), mon événement reçu avant est traité, l'instance éxécute la branche correspondant à l'événement reçu avant.

    Dans mon cas, ceci ne m'arrange. Ma 1ère solution est de rajouter un handle des événements du second listen qui reviendrait directement sur la 1ère écoute.
    Si qqun a une solution plus sympathique. L'idée serait que juste après le traitement du 1er listen, je fasse une sorte de clear des événements reçus.

    Merci
    Une légende amérindienne raconte qu'il y eut un immense incendie de forêt. Tous les animaux terrifiés et atterrés observaient, impuissants, le désastre. Seul, un colibri s'activait et allait chercher quelques gouttes d'eau dans son bec pour éteindre le feu.
    Au bout d'un moment, le tatou, agacé par ses agissements dérisoires, lui dit :
    'Colibri ! N'es-tu pas fou ? Tu crois que c'est avec ces gouttes d'eau que tu vas éteindre le feu ?
    'Je le sais, répond le colibri, mais je fais ma part...

  2. #2
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 17
    Points : 19
    Points
    19
    Par défaut
    Salut,

    D'abord, est-ce qu'il n'y aurait pas moyen d'éviter que l'host déclenche des évènements que le workflow n'est pas encore capable de traiter? Ça serait peut être la solution la plus simple à ton problème.

    Si ça n'est pas possible, il faut bien se dire que la réponse à ta question n'est pas aussi simple qu'il n'y parait. En général, on est content de pouvoir récupérer des événements déjà déclenchés.

    En interne, WF met les événements qu'il reçoit dans une queue et lorsque l'HandleExternalActivity s'exécute, elle regarde si il y a déjà un événement pour elle dans la queue, si oui, elle le traite et se termine. Si non, elle se met en attente.

    La solution à ton problème est de récupérer la queue et de la vider. On peut récupérer les queues en utilisant le WorkflowQueuingService. Les queues sont identifiées par une instance d'un IComparable. Dans le cas de l'HandleExternalEventActivity, c'est une instance de EventQueueName.

    Une possibilité est de créer une activité qui s'occupe de vider la queue. Voici le contenu de la méthode Execute:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
            protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
    {
         WorkflowQueuingService queuingService = executionContext.GetService<WorkflowQueuingService>();
        EventQueueName queueName = new EventQueueName(typeof(ITest), "TestEvent");           
     
        WorkflowQueue queue = queuingService.GetWorkflowQueue(queueName);
        try
        {
            while (true)
                queue.Dequeue();
        }
        catch (InvalidOperationException) { }
     
        return ActivityExecutionStatus.Closed;
    }
    Je suppose ici que le nom de ton interface est ITest et ton event TestEvent. Si tu utilises la corrélation, faudra peut-être penser à utiliser l'autre constructeur de EventQueueName. Une autre solution pour récupérer l'EventQueueName serait de l'obtenir directement de l'activité:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IEventActivity activity = handleExternalEventActivity1;
    IComparable queueName = activity.QueueName;
    Mais il faut que tu aies accès à l'activité.

    Voila, au final c'est pas bien compliqué, faut juste savoir comment ça marche

Discussions similaires

  1. [XML] [EXPAT] xml_parse et la gestion des événements...
    Par Herode dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 05/02/2006, 20h59
  2. Gestion des évènements Netscape 7.0
    Par RATHQUEBER dans le forum Autres langages pour le Web
    Réponses: 6
    Dernier message: 19/12/2005, 16h26
  3. Problème avec la gestion des événements
    Par CynO dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 17/10/2005, 10h07
  4. [JTable] gestion des événements
    Par soulhouf dans le forum Composants
    Réponses: 4
    Dernier message: 19/08/2005, 13h21
  5. Gestion des évènements lors d'un clique sur une image.
    Par yoghisan dans le forum Débuter
    Réponses: 7
    Dernier message: 23/06/2005, 19h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo