Condividi tramite


Composed Message Processor (esempio di BizTalk Server)

Lo scopo di questo esempio consiste nella creazione di un'applicazione processore di messaggi composti che elabora singole righe da messaggi aggregati.

In particolare, verrà creata una pianificazione dell'orchestrazione per eseguire le attività seguenti:

  1. Ricezione di un messaggio di interscambio batch costituito da più ordini di acquisto.

  2. Disassemblaggio del messaggio di interscambio in singoli documenti di ordine di acquisto.

  3. Elaborazione di ogni documento e conversione di ogni ordine di acquisto in un messaggio di fatturazione.

  4. Assemblaggio di tutti i messaggi di fatturazione in un interscambio batch.

    Il passaggio 3 è semplificato nell'ambito dell'esempio. Ad esempio, in applicazioni più complesse è possibile che un'orchestrazione invii ordini di acquisto disassemblati a più sistemi di gestione scorte back-end e quindi, dopo avere raccolto tutte le risposte, le aggreghi in un messaggio di fatturazione in batch.

    Per ulteriori informazioni sul modello processore di messaggi composti, fare riferimento a [1].

Scopo dell'esempio

Nella soluzione di esempio sono inclusi due progetti, che sono descritti in dettaglio nelle sezioni seguenti.

Pipeline e schemi

Il progetto di pipeline e schemi contiene:

  • Schemi file flat per l'interscambio dell'ordine di acquisto di input e per l'interscambio della fattura di output.

  • Mappa per trasformare il documento di ordine di acquisto in un documento fattura.

  • Pipeline di ricezione e trasmissione.

Schemi file flat per gli interscambi di input e output

L'applicazione di esempio verrà utilizzata con gli interscambi nel formato file flat. Di seguito sono riportati alcuni esempi di interscambio relativo all'ordine di acquisto e alla fattura:

Interscambio di ordine di acquisto (CMPInput.txt):

Northwind Shipping  
Batch type:Purchase Orders  
PO1999-10-20  
US    Alice Smith    123 Maple Street    Mill Valley    CA 90952  
US    Robert Smith   8 Oak Avenue        Old Town       PA 95819  
Hurry, my lawn is going wild!  
ITEMS,ITEM872-AA|Lawnmower|1|148.95|Confirm this is electric,ITEM926-AA|Baby Monitor|1|39.98|Confirm this is electric|1999-10-21  
PO1999-10-21  
US    John Dow       123 Elm Street      Mill Valley    CA 90952  
US    July Dow       8 Pine Avenue       Old Town       PA 95819  
Please ship it urgent!  
ITEMS,ITEM398-BB|Tire|4|324.99|Wrap them up nicely,ITEM201-BB|Engine Oil|1|12.99|SAE10W30|1999-05-22  
PO1999-10-23  
US    John Connor    123 Cedar Street    Mill Valley    CA 90952  
US    Sarah Connor   8 Grass Avenue      Old Town       PA 95819  
Use cheapest shipping method.  
ITEMS,ITEM101-TT|Plastic flowers|10|4.99|Fragile handle with care,ITEM202-RR|Fertilizer|1|10.99|Lawn fertilizer,ITEM453-XS|Weed killer|1|5.99|Lawn weed killer|1999-05-25  

L'interscambio, o documento di ordine di acquisto, include un'intestazione che identifica il tipo di documenti che contiene:

Northwind Shipping  
Batch type:Purchase Orders  

Questo interscambio è costituito da tre documenti di ordine di acquisto. Un'istanza è costituita dalle informazioni indicate di seguito. Come si nota, contiene informazioni quali l'indirizzo di fatturazione e di spedizione e l'elenco degli articoli ordinati.

PO1999-10-20  
US    Alice Smith    123 Maple Street    Mill Valley    CA 90952  
US    Robert Smith   8 Oak Avenue        Old Town       PA 95819  
Hurry, my lawn is going wild!  
ITEMS,ITEM872-AA|Lawnmower|1|148.95|Confirm this is electric,ITEM926-AA|Baby Monitor|1|39.98|Confirm this is electric|1999-10-21  

L'interscambio relativo alla fattura che verrà generato a questo scopo sarà analogo al seguente:

Northwest Shipping  
DocumentTypes:Invoices  
INVOICE1999-10-20  
BILLTO,US,Alice Smith,123 Maple Street,Mill Valley,CA,90952  
872-AA    Lawnmower         1    148.95    Confirm this is electric  
926-AA    Baby Monitor      1    39.98     Confirm this is electric  
INVOICE1999-10-21  
BILLTO,US,John Dow,123 Elm Street,Mill Valley,CA,90952  
398-BB    Tire              4    324.99    Wrap them up nicely  
201-BB    Engine Oil        1    12.99     SAE10W30  
INVOICE1999-10-20  
BILLTO,US,John Connor,123 Cedar Street,Mill Valley,CA,90952  
101-TT    Plastic flowers   10   4.99      Fragile handle with care  
202-RR    Fertilizer        1    10.99     Lawn fertilizer  
453-XS    Weed killer       1    5.99      Lawn weed killer  

Questo interscambio contiene un subset di informazioni prelevato dall'interscambio dell'ordine di acquisto e anche il formato dell'interscambio e dell'intestazione sono diversi.

L'intestazione risulta come segue:

Northwest Shipping  
DocumentTypes:Invoices  

E l'istanza del documento include quanto segue:

INVOICE1999-10-20  
BILLTO,US,Alice Smith,123 Maple Street,Mill Valley,CA,90952  
872-AA    Lawnmower         1    148.95    Confirm this is electric  
926-AA    Baby Monitor      1    39.98     Confirm this is electric  

In primo luogo è necessario creare gli schemi file flat per:

  • Documento di ordine di acquisto (PO.xsd)

  • Documento di fattura (Invoice.xsd)

  • Intestazione dell'ordine di acquisto (POHeader.xsd)

  • Intestazione della fattura (InvoiceHeader.xsd)

    Per questo esempio verrà descritto il processo di creazione di schemi flat file. Per informazioni sulla creazione di schemi flat file da istanze di documento, fare riferimento alla sezione della documentazione "Creazione di uno schema di file flat da un'istanza di documento".

Mappa per la trasformazione di un documento di ordine di acquisto in un documento fattura

La mappa (PO2Invoice.btm) consente di trasformare un'istanza dell'ordine di acquisto in un documento fattura.

Pipeline di ricezione e trasmissione

La pipeline di ricezione (FFReceivePipeline.btp) contiene un componente disassembler del file flat utilizzato per elaborare un interscambio di ordine di acquisto. In particolare, per l'interscambio nel file CMPInput.txt, rimuove l'intestazione interscambio e produce tre documenti XML corrispondenti a tre ordini di acquisto.

Il disassembler del file flat nella pipeline di ricezione è configurato come segue:

  • Schema documento: PipelinesAndSchemas.PO

  • Schema intestazione: PipelinesAndSchemas.POHeader

  • Mantieni intestazione: False

  • Interscambio recuperabile: False

  • Schema trailer: (Nessuno)

  • Convalidare la struttura del documento: False

    La pipeline di trasmissione (FFSendPipeline.btp) contiene un componente assembler di flat file utilizzato per creare l'interscambio della fattura aggregata.

    L'assembler di file flat nella pipeline di trasmissione è configurato come segue:

  • Schema documento: PipelinesandSchemas.Invoice

  • Schema intestazione: PipelinesAndSchemas.InvoiceHeader

  • Mantieni il contrassegno di ordine dei byte: False

  • Set di caratteri di destinazione: (Nessuno)

  • Schema trailer: (Nessuno)

Pianificazione dell'orchestrazione

La pianificazione dell'orchestrazione (CMP.odx) è il punto in cui avviene l'elaborazione principale. Vengono eseguite in modo specifico le operazioni seguenti:

  • Viene eseguita la pipeline di ricezione per disassemblare l'interscambio dell'ordine di acquisto

  • Viene trasformato ogni messaggio di output della pipeline di ricezione

  • Viene eseguita la pipeline di trasmissione per assemblare un interscambio relativo alla fattura

Creazione della pianificazione dell'orchestrazione e definizione delle variabili globali

L'orchestrazione riceverà un interscambio flat file come input e invierà un interscambio flat file come output. È quindi necessario definire i messaggi di input e output (denominati rispettivamente InputInterchange e OutputInterchange) come indipendenti dal tipo, ovvero di tipo System.Xml.XmlDocument.

Inoltre, è necessario definire un ambito atomico in cui si eseguirà l'elaborazione dei messaggi. Questa operazione è necessaria perché la pipeline di ricezione può essere eseguita all'interno di un ambito atomico.

Esecuzione della pipeline di ricezione

Il passaggio successivo consiste nell'aggiunta di logica per l'esecuzione di una pipeline di ricezione per il messaggio ricevuto in un'orchestrazione. A questo scopo, viene innanzitutto dichiarata una variabile (denominata RcvPipeOutput) di tipo Microsoft.XLANGs.Pipeline.ReceivePipelineOutputMessages all'interno dell'ambito. La variabile è un enumeratore che consente di elaborare ciclicamente i messaggi di output della pipeline di ricezione. Tenere presente che per accedere a questo tipo e a tutti gli altri tipi di esecuzione di pipeline dall'orchestrazione è necessario aggiungere riferimenti agli assembly seguenti:

  • Microsoft.XLANGs.Pipeline.dll

  • Microsoft.BizTalk.Pipeline.dll

    Non è garantito che la pipeline di ricezione venga sempre eseguita correttamente. È possibile che i messaggi siano in formato non corretto, con conseguente esito negativo dell'elaborazione della pipeline. Quando l'esecuzione di una pipeline ha esito negativo nell'orchestrazione, viene generata un'eccezione che può essere rilevata ed è possibile eseguire la logica di gestione degli errori. Per rilevare l'eccezione generata dalla pipeline, è necessario eseguire la pipeline con un ambito non atomico con gestione delle eccezioni. Il codice effettivo per l'esecuzione della pipeline viene richiamato da una forma Espressione all'interno di tale ambito.

    Nella forma Espressione ExecuteRcvPipe scrivere la seguente riga di codice per eseguire la pipeline di ricezione:

RcvPipeOutput = Microsoft.XLANGs.Pipeline.XLANGPipelineManager.ExecuteReceivePipeline(typeof(PipelinesAndSchemas.FFReceivePipeline), InputInterchange);  

È opportuno analizzare questa riga di codice in modo più dettagliato. Come si nota, viene chiamato un metodo statico ExecuteReceivePipeline che richiede come parametro un tipo di pipeline di ricezione da eseguire e un messaggio di input. Di conseguenza, produce un oggetto enumeratore con il set di messaggi di output. Il risultato viene assegnato a una variabile di tipo ReceivePipelineOutputMessages definita precedentemente nell'ambito.

È stato inoltre incluso un blocco per la gestione delle eccezioni per l'ambito di esecuzione della pipeline. Questo blocco rileva l'eccezione di tipo XLANGPipelineManagerException e successivamente, per semplicità, termina semplicemente un'istanza di orchestrazione con un messaggio di errore personalizzato.

In scenari più complessi possono essere eseguite ulteriori attività di gestione degli errori, quali la generazione di messaggi di notifica di errore e il relativo invio a un utente di business o a un amministratore tramite posta elettronica.

Trasformazione dei messaggi di output della pipeline

Dopo l'esecuzione della pipeline e la produzione del set di messaggi disassemblati, è necessario trasformare i singoli messaggi di output in un formato diverso.

Per utilizzare la trasformazione nell'orchestrazione è necessario definire due messaggi: input e output della trasformazione. Questi messaggi verranno definiti all'interno dell'ambito atomico. Il messaggio di input della trasformazione denominato TmpMessageIn sarà di tipo PipelinesAndSchemas.PO. Il messaggio di output della trasformazione denominato TmpMessageOut sarà di tipo PipeliensAndSchemas.Invoice. Verrà applicata la mappa PO2Invoice.btm definita nel progetto PipelinesAndSchemas.

Per mappare ogni messaggio di output della pipeline, è necessario eseguire la trasformazione all'interno del ciclo. Si utilizzerà una forma Ciclo con la condizione di uscita che segue:

RcvPipeOutput.MoveNext()  

Il metodo MoveNext() è un metodo standard dell'interfaccia .NET IEnumerator che consente di spostarsi all'interno dell'insieme di messaggi di output della pipeline. Quando raggiunge la fine dell'insieme, restituisce false.

La prima forma di costruzione viene utilizzata per costruire un messaggio di orchestrazione TmpMessageIn dal messaggio di output della pipeline.

Codice nella forma di costruzione:

TmpMessageIn = null;  
RcvPipeOutput.GetCurrent(TmpMessageIn);  

In questo codice, il messaggio dell'orchestrazione viene inizializzato su null e quindi viene impostato sul messaggio corrente dall'insieme di messaggi di output della pipeline.

Nella seconda forma di costruzione viene eseguita la trasformazione effettiva di TmpMessageIn e viene costruito il messaggio TmpMessageOut di tipo PipelinesAndSchemas.Invoice.

Esecuzione della pipeline di trasmissione

L'ultimo passaggio di elaborazione nell'orchestrazione consiste nell'esecuzione della pipeline di trasmissione del flat file per assemblare tutti i messaggi XML trasformati in un interscambio flat file.

Per eseguire una pipeline di trasmissione è necessario utilizzare una variabile di tipo Microsoft.XLANGs.Pipeline.SendPipelineInputMessages denominata SendPipeInput che conterrà un insieme di messaggi di orchestrazione che devono essere elaborati in una pipeline di trasmissione.

Nell'ultima espressione del ciclo in cui è stata eseguita la trasformazione verrà scritto un codice che determinerà l'aggiunta di ogni messaggio trasformato a un insieme di messaggi per la pipeline di trasmissione:

SendPipeInput.Add(TmpMessageOut);  

Analogamente alla parte in cui viene eseguita la pipeline di ricezione, il codice per l'esecuzione della pipeline di trasmissione viene posizionato all'interno di un ambito non atomico con un blocco di gestione delle eccezioni. Il codice di esecuzione della pipeline di trasmissione si trova nella forma Assegnazione messaggio del blocco di costrutto.

OutputInterchange = null;  
Microsoft.XLANGs.Pipeline.XLANGPipelineManager.ExecuteSendPipeline(typeof(PipelinesAndSchemas.FFSendPipeline), SendPipeInput, OutputInterchange);  

Il blocco di costrutto viene utilizzato per costruire il messaggio di output della pipeline OutputInterchange indipendente dal tipo, ovvero System.Xml.XmlDocument. Quindi, nella forma Assegnazione messaggio il messaggio costruito viene inizializzato su null. Successivamente, viene richiamato il metodo statico ExecuteSendPipeline per l'esecuzione di una pipeline di trasmissione. Questo metodo accetta come parametro un tipo di pipeline di trasmissione da eseguire, il messaggio di input e il riferimento al messaggio di output in cui verrà archiviato l'output della pipeline.

Come per l'esecuzione della pipeline di ricezione, anche in questo caso è presente un blocco di gestione delle eccezioni per l'ambito di esecuzione della pipeline. Questo blocco rileva l'eccezione di tipo XLANGPipelineManagerException e successivamente, per semplicità, termina semplicemente un'istanza di orchestrazione con un messaggio di errore personalizzato.

Percorso dell'esempio

Nella tabella seguente vengono elencati i file di questo esempio.

File Descrizione
Cleanup.bat Viene utilizzato per annullare la distribuzione degli assembly e rimuoverli dalla Global Assembly Cache.

Consente inoltre di rimuovere porte di trasmissione e ricezione.

Consente infine di rimuovere le directory virtuali di Microsoft Internet Information Services (IIS), se necessario.
ComposedMessageProcessor.sln File di soluzione Visual Studio per l'esempio.
ComposedMessageProcessorBinding.xml File di associazione per l'esempio.
Setup.bat Utilizzato per compilare e inizializzare l'esempio.
Nella cartella Orchestration:

CMP.odx
Orchestrazione che esegue la pipeline di ricezione per disassemblare il messaggio, trasforma ogni messaggio disassemblato e quindi esegue la pipeline di trasmissione per assemblare i messaggi in un interscambio.
Nella cartella Orchestration:

Orchestration.btproj
Progetto BizTalk per l'orchestrazione.
Nella cartella Orchestration:

SuspendMessage.odx
Orchestrazione utilizzata per sospendere i messaggi per i quali l'elaborazione della pipeline ha esito negativo.
Nella cartella PipelinesAndSchemas:

CMPInput.xml, CMPOutput.xml
Istanze dei documenti di input e output per l'esempio.
Nella cartella PipelinesAndSchemas:

FFReceivePipeline.btp, FFSendPipeline.btp
Pipeline di ricezione e trasmissione con componenti flat file. Queste pipeline vengono eseguite all'interno dell'orchestrazione.
Nella cartella PipelinesAndSchemas:

Invoice.xsd, InvoiceHeader.xsd
Schemi file flat per il documento di output e l'intestazione.
Nella cartella PipelinesAndSchemas:

PO.xsd, POHeader.xsd
Schemi file flat per il documento di input e l'intestazione.
Nella cartella PipelinesAndSchemas:

PropertySchema.xsd
Schema proprietà per l'esempio.

Compilazione e inizializzazione dell'esempio

Utilizzare la procedura seguente per compilare e inizializzare l'esempio Compose.

Per compilare e inizializzare l'esempio Compose

  1. In una finestra di comando passare alla seguente cartella:

    <Percorso> esempi\Pipelines\ComposeMessageProcessor

  2. Eseguire il file Setup.bat. Verranno eseguite le operazioni seguenti:

    • Crea le cartelle di input (In) e output (Out) dell'esempio nella cartella:

      <Percorso> esempi\Pipelines\ComposeMessageProcessor

    • Compilazione di progetti di Visual Studio per l'esempio.

    • Creazione di una nuova applicazione denominata "CMP Sample" in cui vengono distribuiti gli assembly di esempio.

    • Creazione e binding dell'indirizzo di ricezione di BizTalk e delle porte di trasmissione e ricezione.

    • Integrazione e avvio dell'orchestrazione, abilitazione dell'indirizzo di ricezione e avvio della porta di trasmissione.

      Se si sceglie di aprire e compilare i progetti dell'esempio senza eseguire il file Setup.bat, è necessario creare prima una coppia di chiavi con nome sicuro utilizzando l'utilità Nome sicuro di .NET Framework (sn.exe). Utilizzare questa coppia di chiavi per firmare gli assembly risultanti.

  3. Prima di tentare di eseguire l'esempio, verificare che in BizTalk Server non siano stati segnalati errori durante il processo di compilazione e inizializzazione.

    Per annullare le modifiche apportate da Setup.bat, eseguire le operazioni seguenti:

    1. Arrestare e riavviare l'istanza dell'host dalla Console di amministrazione BizTalk Server.

    2. Eseguire Cleanup.bat. È necessario eseguire Cleanup.bat prima di eseguire Setup.bat una seconda volta.

Esecuzione dell'esempio

Utilizzare la procedura seguente per eseguire l'esempio ComposedMessageProcessor.

Per eseguire l'esempio ComposedMessageProcessor

  1. Copiare il file di testo CMPInput.txt che si trova nella cartella PipelinesAndSchemas. Incollarlo nella cartella In.

  2. Osservare il file di testo creato nella cartella Out. Questo file contiene gli stessi record del CMPInput.txt, ma il formato dei dati nel file è diverso.

    Quando il messaggio passa attraverso BizTalk Server, si verifica quanto segue:

    1. Il messaggio viene disassemblato e convertito in messaggi XML. Ogni messaggio viene mappato a un formato diverso.

    2. Tutti i messaggi mappati vengono assemblati e convertiti nel formato file flat.

Vedere anche

Pipelines (cartella di esempi di BizTalk Server)