2

J'ai un tas de Workflow Foundation 4.0 Activités de code RC qui consomment des services Web et parlent aux bases de données que je veux ajouter une erreur de manipulation dans.Flux de travail 4.0 activités de code d'appel d'autres activités (persist, retard, etc.)

I J'aimerais vraiment pouvoir essayer d'appeler mon service web/db, attraper des défauts tels qu'un échec de communication, puis réessayer la même opération dans 1 heure (après avoir enregistré l'exception).

Y at-il une façon de faire quelque chose comme ça?

protected override void Execute(CodeActivityContext context) { 

    Persist(); // I would like to invoke the persist activity like this 

    if (!AttemptServiceCall()) { 

     // I would like to invoke a delay activity like this 
     Delay(new TimeSpan(0, 30, 0)); // wait 30 mins before trying again 
     Execute(context); // call this activity again 
    } 
} 

private bool AttemptServiceCall() { 

    bool serviceCallSuccessful = true; 

    try { 
     myService.InvokeSomeMethod(); 
    } 
    catch (CommunicationException ex) { 
     myEventLogger.Log(ex); 
     serviceCallSuccessful = false; 
    } 

    return serviceCallSuccessful; 
} 

Répondre

2

Oui, ce n'est pas difficile du tout une fois que vous savez comment fonctionnent les activités WF4.

Je pourrais taper une longue histoire, mais comme Richard Blewett a déjà écrit un blog sur une activité Retry qui fait exactement l'action que vous décrivez, je vais juste créer un lien vers cet article du blog here. La seule chose qui manque est la persistance mais cela devrait être facile à ajouter.

Créez simplement votre activité AttemptServiceCall et ajoutez-la comme corps. Étant donné que cela semble être une action potentiellement longue, je suggère d'utiliser une AsyncCodeActivity comme classe de base.

+0

Merci pour votre réponse rapide encore une fois Maurice - vous êtes le roi du flux de travail! – Lygpt