Domanda

Attualmente stiamo costruendo un sistema che estrae tutti i tipi di dettagli tecnici sui servizi Web da alcuni altri sistemi. È un po 'come un Enterprise Bus, ma fa un po' di più.

Abbiamo deciso di utilizzare Windows Workflow per gestire le richieste. Non appena capiremo quale tipo di azione è richiesta, inizieremo un flusso di lavoro che è specificamente progettato per gestire l'azione. Ora, alcuni dei servizi Web che chiameremo sono asincroni, quindi il flusso di lavoro dovrebbe attendere una risposta. L'idea di base è che implementeremo il servizio web di callback da parte nostra e quando il callback arriva 'in qualche modo' forniamo i suoi dati al flusso di lavoro in esecuzione che sta aspettando la risposta.

Finora ho visto due possibilità:

  1. ExternalDataExchangeService
  2. il WorkflowQueuingService

Il primo servizio è relativamente facile da usare, ma è basato su eventi, quindi se perdi l'evento, perdi i dati. Abbiamo bisogno di una soluzione basata sulla coda, poiché è tecnicamente possibile ricevere la richiamata da un servizio Web anche prima di ottenere la risposta sincrona che ci dice che riceveremo una richiamata a breve.

Il secondo servizio sembrava perfetto, ma è molto limitante nel modo in cui può essere utilizzato. Inserire un oggetto nella coda è molto semplice, ma dobbiamo assicurarci che la coda esista prima di poterlo fare. E la creazione della coda sembra essere possibile solo nell'override Execute di un'attività. Dal momento che abbiamo molti flussi di lavoro diversi, abbiamo una classe di flusso di lavoro di base che fa un po 'di lavoro nel suo override Initialize e vorrebbe molto fare la creazione della coda lì dentro, quindi non dovremo creare uno speciale " Initialize " attività con cui ogni flusso di lavoro dovrebbe iniziare. Vorremmo anche ricevere una notifica per quando un nuovo articolo viene ricevuto nella classe base. Quindi il flusso di lavoro specifico dovrebbe solo attendere su WaitHandle per sapere che ci sono dati sulla coda. Infine, vogliamo essere in grado di leggere i dati dalla coda da un'attività di codice sul flusso di lavoro specifico (dopo la segnalazione di WaitHandle).

Qualcuno ha un'idea, non deve essere con i due servizi che ho citato, ma vorremmo davvero mantenere le cose il più semplici possibile.

È stato utile?

Soluzione 2

Ho scoperto che la mia ipotesi era sbagliata. Ero sicuro al 100% di aver testato lo scenario e mi sono imbattuto in problemi, ma dopo una discussione con un collega l'ho testato nuovamente e ExternalDataExchangeService ha funzionato bene. Quindi non c'è bisogno di trovare una soluzione più complessa, per ora andiamo con ExternalDataExchangeService.

Altri suggerimenti

In WF tutte le comunicazioni tra il runtime o i servizi e i flussi di lavoro effettivi sono basate sulla coda. ExternalDataExchangeService sembra utilizzare eventi ma questi sono solo un sottile strato attorno al meccanismo WorkflowQueuingService e WorkflowQueue.

In generale, preferisco utilizzare WorkflowQueuingService in quanto offre il controllo completo. Una volta comprese le nozioni di base, nella maggior parte dei casi è ancora più semplice lavorare con ExternalDataExchangeService.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top