BizTalkia.com
BizTalk User Group

Spaccare i record SQL in n messaggi - SQL debatching

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:

  1. creo la stored procedure per tirarmi i dati da SQL
  2. mi creo lo schema usando "Add Generated Items..." - SQL wizard 
  3. imposto le proprietà usate da debatching engine (XMLReceive pipeline)
  4. creo nuovo schema che come nodo root ha quello del singola pizza e includo XSD precedentemente creato
  5. imposto le proprietà che distinguono questo schima da quello già definito
  6. 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:

la procedura stored: ps_Menu 

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.

Generazione schema: MenuPizze.XSD

 

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

Schema layout: 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 

Impostazione proprietà

 

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):

Nuovo schema: Pizza.XSD

In questo modo abbiamo tutta la struttura presente nello schema creata da SQL wizard sotto quella nostra. Ora non rimane da fare altro che:

  1. Creo lo schema Pizza.XSD
  2. Cambio la proprietà Target Namespace a http://solnuke/test/Pizze/SQLDebatching
  3. Clicco la proprietà Imports, scelgo XML Include dalla tendina e punto lo schema creato da wizard
  4. Rinomino nodo 'Root' a Pizze e cambio sua proprietà Data Structure Type a PizzeType
  5. 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)

pipeline

 

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
Filed under: ,

Comments

Nino Crudele wrote re: Spaccare i record SQL in n messaggi - SQL debatching
on 06-05-2008 4:10

Bel post.

Complimenti Ivan

Powered by Community Server (Commercial Edition), by Telligent Systems