Condividi tramite


Come creare sottoscrizioni di ricezione nelle orchestrazioni chiamate

Sebbene sia possibile passare messaggi come parametri tramite la forma Avvia orchestrazione all'avvio di un'orchestrazione, in alcuni scenari potrebbe essere necessario inviare messaggi dall'orchestrazione chiamante all'orchestrazione richiamata dopo la chiamata. È ad esempio possibile che non si sappia quali messaggi si desidera passare al momento della chiamata o che altre orchestrazioni abbiano bisogno di inviare messaggi all'orchestrazione chiamata in modo dinamico.

Per inviare un messaggio a un'orchestrazione chiamata si passa una correlazione, in modo che l'orchestrazione chiamata possa creare la sottoscrizione che la correlazione consente di definire e quindi ricevere il messaggio utilizzando la sottoscrizione in questione. Tuttavia, non è possibile semplicemente passare una correlazione e aspettarsi che l'orchestrazione chiamata crei la sottoscrizione in base alla correlazione e riceva un messaggio sulla sottoscrizione. Se si usa questo approccio, i messaggi inviati dall'orchestrazione chiamante all'orchestrazione richiamata genereranno l'errore "Impossibile instradare il messaggio pubblicato perché non sono stati trovati sottoscrittori". Ciò è dovuto al seguente:

  • È presente una race condition nell'orchestrazione chiamata.

  • Non è presente alcun punto di commit per l'orchestrazione chiamata per l'invio della sottoscrizione al database MessageBox per il routing, in modo che l'orchestrazione possa ricevere i messaggi.

    Uno dei modi per risolvere tale problema consiste nell'eseguire la procedura seguente:

  1. Nell'orchestrazione chiamante è presente una ricezione attivata per la ricezione del messaggio. Dopo aver ricevuto il messaggio nell'orchestrazione del chiamante, inizializzare il set di correlazioni e quindi passare il set di correlazioni e una porta con associazione diretta di ricezione tramite la forma Avvia orchestrazione . La porta passata diventa una porta di trasmissione nell'orchestrazione chiamata e viene utilizzata per reinviare il messaggio per la sincronizzazione con l'orchestrazione chiamante.

  2. Nell'orchestrazione chiamata, reinviare un messaggio all'orchestrazione chiamante tramite la porta con correlazione automatica. In questo modo si esegue la sincronizzazione con l'orchestrazione chiamante, per evitare race condition e fornire un punto di commit durante la creazione della sottoscrizione di ricezione per MessageBox per il routing nell'orchestrazione chiamata.

  3. L'orchestrazione chiamante riceve il messaggio tramite la porta con correlazione automatica e si sincronizza con l'orchestrazione chiamata. Si noti che le ricezioni della porta con correlazione automatica non hanno bisogno di correlazioni seguenti. È ora possibile inviare messaggi in modo sicuro dall'orchestrazione chiamante all'orchestrazione chiamata, che li riceverà in base alla correlazione.

    Sebbene l'obiettivo possa essere raggiunto con il metodo precedente, un metodo migliore consiste nel passare il messaggio che inizializza la correlazione in base alla quale si desidera ricevere i messaggi. Quando si sincronizza un'orchestrazione chiamante con un'orchestrazione chiamata tramite una porta con correlazione automatica, è consigliabile passare sempre il messaggio necessario per inizializzare le correlazioni. La procedura seguente rappresenta il metodo più affidabile ed efficiente per raggiungere lo scopo:

  4. Nell'orchestrazione chiamante è presente una ricezione attivata per la ricezione del messaggio. Dopo aver ricevuto il messaggio, passare un messaggio e una porta con associazione diretta tramite la forma Avvia orchestrazione . Il messaggio passato verrà utilizzato per inizializzare la correlazione nell'orchestrazione chiamata. La porta passata diventa una porta di trasmissione nell'orchestrazione chiamata e viene utilizzata per reinviare il messaggio per la sincronizzazione con l'orchestrazione chiamante.

  5. Nell'orchestrazione chiamata, inizializzare la correlazione e reinviare un messaggio all'orchestrazione chiamante. In questo modo si esegue la sincronizzazione con l'orchestrazione chiamante, per evitare race condition e fornire un punto di commit durante la creazione della sottoscrizione di ricezione per MessageBox per il routing nell'orchestrazione chiamata.

  6. L'orchestrazione chiamante riceve il messaggio tramite la porta con correlazione automatica e si sincronizza con l'orchestrazione chiamata. Si noti che le ricezioni della porta con correlazione automatica non hanno bisogno di correlazioni seguenti. È ora possibile inviare messaggi in modo sicuro dall'orchestrazione chiamante all'orchestrazione chiamata, che li riceverà in base alla correlazione.

Vedere anche

Uso di correlazioni nelle orchestrazioni
Come utilizzare porte con binding diretto a correlazione automatica