BlogServiceHost.Create()

WCF & Azure - Il blog di Fabio Cozzolino

Recent Posts

Tags

My

Twitter

Community

Archives

Email Notifications

Social Bar Widget

Silver e gli eventi esterni ...

In questi giorni sto "lottando" parecchio con Silver. No, non mi sono convertito a Silverlight Stick out tongue. Silver è il nome utilizzato per identificare il punto di incontro tra WCF e Workflow Foundation (WF). Il tutto viene risolto attraverso il WorkflowServiceHost, un service host che estende quello di base e che si preccupa di aggiungere un particolare ServiceBehavior responsabile di gestire il runtime di WF: il WorkflowRuntimeBehavior.

Giusto per dare un'idea, dopo aver creato il WorkflowServiceHost, possiamo accedere al runtime recuperandolo dalla collezione di ServiceBehaviors:

1 using (WorkflowServiceHost host = new WorkflowServiceHost(typeof(CustomWorkflow))) 2 { 3 WorkflowRuntimeBehavior wrBehavior = host.Description.Behaviors.Find<WorkflowRuntimeBehavior>(); 4 5 ExternalDataExchangeService service = new ExternalDataExchangeService(); 6 service.AddService(new MyClass()); 7 8 wrBehavior.WorkflowRuntime.AddService(service); 9 10 host.Open(); 11 12 // .... 13 14 host.Close(); 15 }

In questo codice sto ospitando un WF (CustomWorkflow) all'interno di WCF. Alla ricezione dei messaggi verrà fatto partire direttamente il nostro Workflow. Mi sono permesso anche di aggiungere un servizio perchè il mio workflow si deve mettere in ascolto di eventi generati dalla classe MyClass.

Ora, senza entrare troppo nel merito del meccanismo di gestione degli eventi esterni e dell'utilizzo della relativa HandleExternalEventActivity, ma data la mia poca conoscenza di WF, e quindi ammetto che potrei sbagliarmi, ma questo sistema soffre di un piccolissimo problema. Trattandosi di un servizio, abbiamo più istanze del CustomWorkflow in esecuzione all'interno dello stesso runtime (WorkflowRuntime). Ma all'interno dello stesso runtime ci sarà soltanto una istanza della classe MyClass responsabile di scatenare l'evento che il mio workflow attende.

Chiaramente non potrò mai e poi mai avere più sottoscrittori, parlando di WF e della HandleExternalEventActivity, dello specifico evento generato dall'unica istanza della classe MyClass. Il risultato è che a "vincere" sarà l'ultima istanza di workflow che si è sottoscritta appena prima che l'evento venisse generato. Tutte le restanti istanze riceveranno una bella eccezione di tipo:

Event <eventName> on interface type <eventInterface> for instance id <workflowInstanceId> cannot be delivered.

Ci ho perso un po di tempo, ma una volta capito il problema ho dovuto risolvere non più attendendo un evento, ma facendo un polling sulla risorsa, una soluzione che certamente avrei voluto evitare.

Non so se ho detto qualche castroneria su WF, ma spero veramente di sbagliarmi e che qualcuno di voi si sia già "scontrato" con questo tipo di problematica, così magari mi da pure una dritta Stick out tongue ...

Ciauz

Posted: Oct 04 2008, 07:22 PM by Fabio.Cozzolino | with 5 comment(s)
Filed under: , ,

Comments

GBFoundation said:

Ciao Fabio,

premetto che non ho ancora provato ad utilizzare WCF in WF, ma il servizio responsabile della gestione del workflow runtime engine è la classe(di default) DefaultWorkflowSchedulerServices. Questo servizio esegue i workflow in modo asincrono.

Credo che nel tuo caso sia necessario rendere il tutto in modo sincrono aggiungendo al runtime il servizio ManualWorkflowSchedulerService.

Non sò se ho ben compreso il tuo quesito...spero di si altrimenti sorry :)

# October 4, 2008 2:41 PM

Fabio.Cozzolino said:

Ciao,

grazie della risposta. Una cosa che ho omesso di dire è che "purtroppo" in Silver non è possibile modificare il WorkflowSchedulerService utilizzato di default. Infatti avevo pensato di introdurre il ManualWorkflowSchedulerService, ma purtroppo mi viene impedito l'utilizzo a runtime con una bella eccezione che mi dice che non è possibile modificare il DefaultWorkflowSchedulerService. come riportato su questo forum (forums.microsoft.com/.../ShowPost.aspx) l'unica possibilità è quella di modificare il SynchronizationContext, ma sinceramente è una strada che non ho voluto percorrere per diversi motivi.

Sad

# October 5, 2008 2:45 AM

GBFoundation said:

A runtime l'unico servizio che si può aggiungere è quello di tracking.

Non conoscendo il progetto è difficile dire se esiste un'altra strada oltre al polling :(

# October 5, 2008 3:31 AM

Fabio.Cozzolino said:

> A runtime l'unico servizio che si può aggiungere è quello di tracking.

Fortunatamente anche quello di persistenza Stick out tongue.

Comunque, non che il polling sia il male assoluto, anzi, ma solitamente cerco di percorrere altre strade prima di arrivare a quella....

# October 5, 2008 3:56 AM

GBFoundation said:

> Fortunatamente anche quello di persistenza Stick out tongue.

...hai perfettamente ragione( stavo pensando a più instanze per un servizio, ma non c'entrava nulla) ;)

> Comunque, non che il polling sia il male assoluto, anzi, ma solitamente cerco di percorrere altre strade prima di arrivare a quella....

Concordo, tra l'altro il meccanismo del polling viene usata dalla stessa Microsoft nella persistenza

# October 5, 2008 6:13 AM