Qualche giorno fa, per la n-esima volta mi sono trovato di fronte alla stessa domanda: "ma se io ho una stored procedure e tiro su diverse righe mi piacerebbe elaborarle come i messaggi singoli. Come faccio?"
Stranamente, ma non è proprio una cosa "supportata by design" come lo è usando Flat File Schema Wizard.
Quindi, l'idea generale è questa:
- creo la stored procedure per tirarmi i dati da SQL
- mi creo lo schema usando "Add Generated Items..." - SQL wizard
- imposto le proprietà usate da debatching engine (XMLReceive pipeline)
- creo nuovo schema che come nodo root ha quello del singola pizza e includo XSD precedentemente creato
- imposto le proprietà che distinguono questo schima da quello già definito
- deploy-o e creo la porta di ricezzione SQL ed, eventualmente, la porta Send, di tipo FILE, per salvare da qualche parte risultato di debatching
Per questo post ho creato 3 tabelle nel DB 'Pizze': Pizze, Ingredienti e Pizze_Ingredienti. (Nota: nel .ZIP che ho incluso si trova SQL script del DB)
Poi, ho creato una stored procedure ps_Menu come segue:
A questo punto siamo pronti per creare lo schema che rapresenta il nostro 'menu del giorno'. (Nota: ricordatevi, una volta creato lo schema, di togliere XMLDATA dalla stored perché così ritornerà i dati a posto della struttura!)
Per creare lo schema, vado su progetto (in VisualStudio), clicco sul tastro destro e scelgo Add Generated Items... Imposto SQL adapter configurando l'accesso al DB puntando quello delle pizze. La prossima schermata si presenta come quella sotto per definire un "Namespace" da usare per questi messaggi ed imposto Root element Name.
Sulla prossima schermata scelgo la "Stored Procedure" ed arrivo su quella che mi permette di scegliere la procedura da eseguire. Da menu a tendina seleziono "ps_Menu" e clicco bottone "Generate".
Oltre allo schema che vedete sotto viene anche generata una orchestrazione. Questa a noi non serve per cui la cancelliamo dal progetto.
Per puro piacere rinomino lo schema a: MenuPizze.xsd
Prima di proseguire, devo togliere tag XMLDATA dalla stored procedure per poter ricevere i dati da SQL.
Il fatto di processare ogni record ritornato da SQL come un messaggio si chiama debatching - quindi spaccare un unico messaggione in tanti messaggi piccoli. Per fare ciò BizTalk prevede l'utilizzo della pipeline XMLReceive (che imposteremo più tardi) e proclamando lo schema che abbiamo precedentemente creato di essere un Envelope. Quindi imposto la proprietà Envelope a true e Max Occurs del nodo Pizze a 1 e Body XPath del nodo MenuDelGiorno a MenuDelGiorno
Fin' qui è tutto regolare e lineare - come per fare debatching di qualuncue altro messaggio. Purtroppo, lo schema generata da SQL wizard include un tag di più di quanto noi ne abbiamo bisogno il MenuDelGiorno. Per risolvere questo dobbiamo applicare un trucco: creare un nuovo messaggio che abbia la stessa struttura per quanto riguarda il nodo Pizze però al livello root!
La via più breve, ed anche più corretta, è usare XSD Include dopo avere creato nuovo messaggio (come da immagine):
In questo modo abbiamo tutta la struttura presente nello schema creata da SQL wizard sotto quella nostra. Ora non rimane da fare altro che:
- Creo lo schema Pizza.XSD
- Cambio la proprietà Target Namespace a http://solnuke/test/Pizze/SQLDebatching
- Clicco la proprietà Imports, scelgo XML Include dalla tendina e punto lo schema creato da wizard
- Rinomino nodo 'Root' a Pizze e cambio sua proprietà Data Structure Type a PizzeType
- L'ultima cosa da fare e cambiare la proprietà Root Reference a Pizze altrimenti avrete un messaggio nel event log come questo:
Error details: There was a failure executing the receive pipeline: .... Reason: Cannot locate document specification because multiple schemas matched the message type http://solnuke/test/Pizze/SQLDebatching#MenuDelGiorno
Ci sarebbe da impostare anche la pipeline sulla porta di Receive e configurarla come XMLReceive (raffigurata dall'immagine sottostante)
Ecco, questo è quanto. Vi allego anche un piccolo progetto per giocarci. Dentro lo ZIP troverete la cartella col progetto e un file .SQL per crearvi la struttura del database Pizze. Prima di testare aggiungete qualche pizza a menu :-)
Posted
Jun 03 2008, 11:37 AM
by
Ivan