L'esempio di Messaggio di grandi dimensioni è un'applicazione di esempio flusso di messaggi basata sullo scenario di elaborazione di fine giornata dei dati sulle vendite. Messaggi in cui sono registrati i dettagli delle vendite durante la giornata vengono raggruppati insieme nell'archivio per la trasmissione al centro IT. Al momento della ricezione nel centro IT i messaggi raggruppati vengono di nuovo suddivisi nelle loro parti costituenti per la successiva elaborazione. Tale suddivisione si realizza utilizzando un flusso di messaggi WebSphere Message Broker. Ogni singolo messaggio che rappresenta una vendita ha la stessa struttura.
I messaggi di input e di output in questo esempio sono implementati come messaggi XML a definizione automatica per semplicità. Potrebbero essere utilizzati facilmente altri formati di messaggi.
Ogni messaggio di input è composto da tre parti:
La struttura SaleList è un struttura complessa. Contiene:
Lo scopo dell'elaborazione in questo esempio è quello di scrivere ogni istanza della struttura SaleList come messaggio WebSphere MQ separato riducendo al minimo le esigenze di memoria globale. L'utilizzo di memoria virtuale viene ridotto al minimo eliminando quelle parti dell'albero del messaggio che sono già state elaborate. In mancanza di questo accorgimento, l'albero del messaggio continuerebbe a crescere sempre più di dimensioni ogni volta che si elabora una singola istanza delle struttura SaleList.
Se l'albero del messaggio continuasse a crescere senza alcuna ripulitura, potrebbe portare a richieste di sempre maggiore memoria virtuale per il gruppo di esecuzione nel quale si esegue il flusso di messaggi. Questo potrebbe causare un serio problema di prestazioni per i messaggi di input con molti megabyte e potrebbe portare alla richiesta di centinaia di megabyte e addirittura gigabyte di memoria virtuale a seconda della dimensione del messaggio di input.
La tecnica per il risparmio di memoria utilizzata nell'esempio richiede l'uso di un albero del messaggio modificabile. Cioè, di un albero in cui parti dell'albero del messaggio possono essere eliminate. L'albero del messaggio per InputRoot non è modificabile e come tale non è possibile eliminare elementi dall'albero in base alle necessità. Di conseguenza, viene creato un altro albero nel flusso di messaggi. Viene stabilito utilizzando una variabile ESQL ROW ed una chiamata alla funzione ESQL CREATE.
L'elaborazione nell'esempio consiste di un flusso di messaggi. L'elaborazione che tale flusso effettua viene descritta di seguito.
Il flusso di messaggi Messaggio di grandi dimensioni esegue la presente elaborazione:
Il flusso di messaggi Messaggio di grandi dimensioni è composto dai seguenti nodi:
Il nodo MQInput denominato MessageWithRepeatingElements legge il messaggio WebSphere MQ che contiene un payload XML. Poiché il messaggio in entrata è in formato XML a definizione automatica, non è necessario specificare una serie di messaggi o un formato per poter analizzare correttamente questo messaggio.
Il nodo Compute denominato ProduceMessageSlicesFromRepeatingElements contiene la maggior parte dell'elaborazione per il flusso di messaggi. Attua la seguente elaborazione:
Il nodo Filter denominato IdentifyWhenSlicingIsComplete applica un'espressione filtro al messaggio che è stato propagato nel nodo ProduceMessageSlicesFromRepeatingElements. Lo scopo della verifica è quello di individuare se il messaggio che si immette nel nodo è un messaggio che dovrebbe essere scritto nella coda di messaggi SaleList elaborati o è il messaggio di conferma batch. Se si tratta di un messaggio che contiene un elemento SaleList, l'elaborazione passa al nodo MQOutput denominato RepeatedElementSlices che scrive il messaggio in una coda WebSphere MQ. Se il messaggio ricevuto nel filtro IdentifyWhenSlicingIsComplete è la conferma batch, viene scritta come un messaggio WebSphere MQ in una coda differente dagli elementi SaleList utilizzando il nodo MQOutput denominato MessageSlicingComplete.
Vi sono nodi supplementari nel flusso di messaggi per consentire l'elaborazione di differenti condizioni di errore. Il nodo MQOutput denominato General Failure è collegato al terminale Failure del nodo MQInput. Il nodo scrive il messaggio nella coda denominata nel nodo MQOutput se si verifica un errore nell'elaborazione all'interno del nodo MQInput. Il nodo Catch del nodo MQInput è connesso ad un nodo Filter denominato CatchProcessing. Un messaggio viene propagato in questo instradamento se un'eccezione viene emessa nel flusso di messaggi e rilevata da questo nodo. L'espressione filtro in CatchProcessing determina se il messaggio che si sta elaborando ha il formato previsto. In caso non lo avesse, l'elaborazione passa al nodo Throw Error dove viene emesso un errore utente. Se il messaggio ha in qualche modo un formato non corretto, ad esempio l'ultimo campo non è denominato SlicingReport, l'elaborazione passa al nodo MQOutput denominato Malformed Messages dove viene scritto in una coda di errori.
Il messaggio di prova utilizzato per eseguire l'esempio di instradamento del messaggio è un messaggio XML a definizione automatica che contiene dettagli della fattura relativa ad un cliente. E' possibile ampliare la dimensione del messaggio ripetendo l'elemento SaleList. Il messaggio utilizzato per l'esempio contiene dieci ripetizioni dell'elemento SaleList. Il layout del messaggio viene mostrato di seguito. In questo caso viene mostrata solo una singola istanza di SaleList.
<SaleEnvelope>
<Header>
<SaleListCount>1</SaleListCount>
</Header>
<SaleList>
<Invoice>
<Initial>K</Initial>
<Initial>A</Initial>
<Surname>Braithwaite</Surname>
<Item>
<Code>00</Code>
<Code>01</Code>
<Code>02</Code>
<Description>Twister</Description>
<Category>Giochi</Category>
<Price>00,30</Price>
<Quantity>01</Quantity>
</Item>
<Item>
<Code>02</Code>
<Code>03</Code>
<Code>01</Code>
<Description>Il quotidiano The Times</Description>
<Category>Libri e Media</Category>
<Price>00,20</Price>
<Quantity>01</Quantity>
</Item>
<Balance>00,50</Balance>
<Currency>Sterlina</Currency>
</Invoice>
<Invoice>
<Initial>T</Initial>
<Initial>J</Initial>
<Surname>Dunnwin</Surname>
<Item>
<Code>04</Code>
<Code>05</Code>
<Code>01</Code>
<Description>L'origine delle specie</Description>
<Category>Libri e Media</Category>
<Price>22,34</Price>
<Quantity>02</Quantity>
</Item>
<Item>
<Code>06</Code>
<Code>07</Code>
<Code>01</Code>
<Description>Microscopio</Description>
<Category>Varie</Category>
<Price>36,20</Price>
<Quantity>01</Quantity>
</Item>
<Balance>81,84</Balance>
<Currency>Euro</Currency>
</Invoice>
</SaleList>
<Trailer>
<CompletionTime>12.00.00</CompletionTime>
</Trailer>
</SaleEnvelope>