Le mappe di esempio illustrano modelli di progettazione che implementano una varietà di scenari di brokering. La progettazione degli strumenti per la mappa del messaggio consente ai modelli di progettazione di essere combinati come modelli composti. Questo fa sì che le mappe del messaggio per scenari complessi vengano create assemblando insieme modelli di progettazione per scenari più semplici. I file di esempio non sono destinati alla distribuzione.
I file di esempio per l'elaborazione di assiemi completi di messaggio si trovano nella cartella message_assembly nel progetto Message Map Sample Message Flows.
Un assieme di messaggio è la combinazione di tutte le intestazioni e del contenuto o del payload del messaggio. I nodi Mapping, DataInsert, DataUpdate, DataDelete e Extract in un flusso di messaggi gestiscono sempre un assieme completo di messaggio. Questo significa che la mappatura per questi nodi mostra sempre un modello assieme di messaggio come origini e destinazioni di una mappa.
Vi sono due modelli di assieme di messaggio in WebSphere Message Broker: il modello Proprietà semplificato ed il modello Intestazioni completo. La scelta dell'uno o dell'altro è una questione di selezione del modello che corrisponde alle esigenze del proprio scenario. La figura a sinistra illustra il modello Proprietà di un assieme di messaggio; quella a destra illustra il modello di assieme di messaggio Intestazioni.
Un assieme di messaggio WebSphere Message Broker include quattro elementi, numerati nella figura:
E' possibile configurare un flusso di messaggi in modo che esegua un salto di tipo Route to Label dopo uno dei nodi Mapping; è utile in scenari di instradamento basato sul contenuto all'interno del flusso.
In questo esempio vengono implementati tre scenari comuni:
In tutti i casi, il contenuto o il payload del messaggio si presenta come ultimo elemento nell'assieme di messaggio.
Utilizzare l'elemento labelName
dell'assieme di messaggio per controllare
l'instradamento di un messaggio dopo un nodo Mapping. Questo è utile in scenari
dove si desidera selezionare i successivi nodi del flusso di messaggi per continuare l'elaborazione
da una mappa.
La seguente figura mostra il file del flusso di messaggi di esempio RouteToLabelUsingMap.msgflow configurato con un nodo Mapping, un nodo Route To Label e diversi nodi Label di destinazione. Le etichette di destinazione dei nodi Label
sono configurate per essere uguali ai rispettivi nomi.
Al fine di selezionare quale nodo Label elaborerà il messaggio
di output, la mappa deve specificare la proprietà Nome etichetta del nodo Label. Il file di mappa di esempio SetLabelNodeLabelName.msgmap gestisce questa situazione utilizzando una riga if
con 2 condition
s ed una riga
else
:
In questo esempio:
$source/rtl:body/content
uguale a zero
verranno elaborati dai nodi di flusso verso il basso dal nodo Label denominato
Target1;$source/rtl:body/content
maggiore di
zero verranno elaborati da nodi di flusso verso il basso dal nodo Label denominato Target2;Spesso una mappa si concentra esclusivamente sul contenuto di un messaggio. In questo scenario, tutte le intestazioni devono essere copiate senza modifiche dalla mappa.
Utilizzare il modello Proprietà per copiare tutte le intestazioni senza modifiche. Quando si seleziona il modello assieme di messaggio Proprietà semplificato, vengono copiate tutte le intestazioni del messaggio ad eccezione della cartella Proprietà, seguendo l'ordine e senza modifiche.
Una volta creata una mappa del messaggio Proprietà, associare l'elemento complesso $source/Properties
all'elemento complesso $target/Properties
. Questo farà sì che la cartella Proprietà venga copiata senza modifiche dall'origine alla
destinazione, insieme a tutte le altre intestazioni anch'esse invariate.
L'immagine riportata sotto mostra il file di esempio CopyAllHeaders.msgmap configurato in modo da copiare tutte le intestazioni (inclusa Proprietà) senza modifiche.
Il modello Proprietà abilita molti scenari broker senza dover affrontare la complessità di dover mappare diverse intestazioni. Il modello Proprietà estrae la maggior parte degli attributi di intestazione importanti per MQ Series e per il programma di analisi MRM e li presenta in un singolo pacchetto. In aggiunta allo scenario Copia di tutte le intestazioni, è opportuno utilizzare il modello Proprietà in situazioni in cui MQ Series è il livello di trasporto ed MRM è il programma di analisi del contenuto del messaggio. Questi attributi possono essere suddivisi nelle seguenti categorie:
Un punto da tenere a mente è che tutti i campi in un modello
Proprietà
devono essere impostati. Se è necessario impostare qualche campo singolo, ad esempio,
MessageFormat
per selezionare il wire format del messaggio di output, si devono impostare
o copiare anche gli altri valori nella cartella Proprietà
. Qualsiasi
campo non esplicitamente impostato non verrà copiato nel messaggio di output.
Il modello Intestazioni
offre la capacità di mappare intestazioni selezionate
oltre alle proprietà. Si noti che il modello Intestazioni
non
supporta la capacità di "copia di tutte le intestazioni": qualsiasi intestazione che non
sia esplicitamente mappata non verrà creata come parte della destinazione.
Le Intestazioni sono suddivise in categorie come intestazioni MQMD, MQ, HTTP e JMS. Utilizzare il
modello Intestazioni
per scenari JMS, SOAP su JMS e HTTP. Utilizzare
il modello Intestazioni
per scenari MQ quando il
modello Proprietà
non fornisce il controllo richiesto.
Compute
ESQL in modo che chiami
la mappa, come descritto di seguito.Compute
ESQL in modo che chiami
la mappa, come descritto di seguito.I file di esempio per scenari con più messaggi di output si trovano nella cartella multiple_output nel progetto Message Map Sample Message Flows.
La regola base per la creazione di più messaggi di output consiste nel dichiarare,
in modo implicito o esplicito, più righe $target
.
Più righe possono essere dichiarate in modo implicito utilizzando una riga
for
. Tramite una riga for
, verranno creati zero o più messaggi di
output, uno per elemento origine fornito come origine della riga
for
. Più messaggi di output possono inoltre essere creati aggiungendo esplicitamente
più di una destinazione tramite il menu Aggiungi origini e destinazioni. Ogni
destinazione di questo tipo creerà un messaggio di output. E' possibile anche combinare righe for
con destinazioni multiple, se ogni elemento in
un'origine crea più messaggi di output autonomamente.
Vi sono diversi scenari in cui è utile configurare una mappa del messaggio per l'output di più messaggi. Alcuni di questi scenari sono:
In questo scenario, un singolo messaggio viene trasformato in messaggi differenti indirizzati a diversi sistemi di informazioni aziendali o altrimenti contiene più campi che si ripetono che è più opportuno elaborare singolarmente;
Un messaggio multipart è un messaggio creato utilizzando la capacità brokers messaggio multipart, che consente a messaggi in differenti wire format o anche con dizionari differenti di essere combinati in un singolo messaggio batch.
Un messaggio di origine contiene dati che è necessario convertire in messaggi separati per più sistemi EIS. Singoli campi, che non si ripetono devono essere combinati per creare più messaggi di output;
Un messaggio di origine contiene un campo che si ripete (ad es. una fattura) che deve essere convertito in più messaggi di output in base ad un valore nel campo (ad es. l'identificativo di un partner commerciale).
Gli strumenti per la mappa del messaggio rendono facile la creazione di più messaggi di output:
è necessario solo specificare più assiemi di messaggio di destinazione o
racchiudere un assieme di messaggio di destinazione in una riga for
.
I file di esempio per questo scenario sono ubicati nella cartella multiple_output nel progetto Message Map Sample Message Flows.
Tutto ciò che è necessario fare per creare più messaggi di output per un campo di origine
che si ripete è racchiudere l'assieme di messaggio di destinazione in una
riga for
che opera sull'origine che si ripete.
La mappa del messaggio di esempio repeating_source.msgmap convertirà un
campo che si ripete in un assieme di messaggio di origine in un flusso di assiemi
di messaggio nel flusso di messaggi che effettua la chiamata. La mappa repeating_source.msgmap racchiude la riga $target
in una riga for
per creare più assiemi di messaggio di output, uno per input che si ripete. Per
ogni assieme, viene copiata la cartella Proprietà, il che significa
che viene utilizzata la funzionalità copia di tutte le cartelle. Quindi, in ogni assieme di messaggio di
output, viene copiato un singolo rtl:body
.
I file di esempio per questo scenario sono ubicati nella cartella multipart_messages nel progetto Message Map Sample Message Flows.
Come per i campi che si ripetono, tutto ciò che è necessario fare per creare più messaggi di
output per un messaggio origine multi-part che si ripete è racchiudere l'assieme
di messaggio di destinazione in una riga for
che opera sulla
definizione del messaggio multi-part che si ripete.
La differenza chiave tra un messaggio multi-part ed un campo regolare che
si ripete è che il messaggio multi-part è definito da un gruppo di contenuto locale con
modello di contenuto open
o open-defined
(un'estensione brokers
allo Schema XML), mentre un campo che si ripete è definito da un
elemento.
Piuttosto che introdurre un costrutto di mappa del messaggio differente per un messaggio multi-part, il gruppo di contenuto viene considerato come se il relativo contenuto fosse un elemento wildcard dello schema XML. La creazione di una mappa per un elemento wildcard dello Schema XML richiede l'utilizzo di una mappa secondaria.
Come si vede nell'esempio, elementi wildcard vengono mappati attraverso l'utilizzo di una mappa secondaria specifica per l'elemento. In effetti, l'elemento wildcard o "sconosciuto" viene convertito in un elemento "noto" da una chiamata alla mappa secondaria.
Il file di esempio per questo scenario è nonrepeating_source.msgmap ubicato nella cartella multiple_output nel progetto Message Map Sample Message Flows.
La tecnica per produrre più messaggi è la stessa indipendentemente dal fatto che l'origine
si ripeta o meno. In questo caso, più
righe $target
vengono dichiarate esplicitamente dalla mappa. Ogni
riga target dichiarata creerà un messaggio di output. Negli scenari che si
ripetono, gli assiemi multipli erano dichiarati in modo implicito dalle
righe for
che contenevano gli assiemi di destinazione e
creavano un assieme di output per elemento nella riga for
.
I file di esempio per questo scenario si trovano nella cartella sorting nel progetto Message Map Sample Message Flows. Vi sono 2 variazioni sul tema:
Ordinamento o raggruppamento quando i valori chiave per l'ordinamento sono noti mentre la creazione della mappa è illustrata dal file sorting.msgmap. Tre possibili valori di campo vengono ordinati in tre messaggi separati utilizzando il modello di progettazione Creazione di più messaggi di output per un input che non si ripete.
Di frequente è necessario calcolare le quantità totali o i conteggi dei record dopo che un singolo messaggio viene convertito in più messaggi. Questa operazione deve essere gestita tramite un secondo passo, nel file total.msgmap. Il flusso di messaggi sort.msgflow illustra come connettere due nodi di mapping per ottenere questo risultato.
Il file di esempio è sorting_dynamic.msgmap. Questo esempio è molto simile ad Ordinamento con chiavi note in anticipo, la differenza cruciale sta nel fatto che la mappa deve andare in un database per ottenere un elenco di chiavi valide. I passi nella mappa sono i seguenti:
$db:select
viene utilizzata per ottenere un elenco di
chiavi da un database.for
elabora ogni voce da
$db:select
a turno. for
di select vi è un'altra
riga for
, che questa volta sceglie ogni record nell'origine
a turno.if
ed una riga condition
filtrano le due righe for
, in modo che solo righe per cui
le chiavi hanno una corrispondenza producono un messaggio di output.$target
crea i messaggi di
output, uno per valore univoco di chiave che si trovi sia nel database che nel
messaggio di origine.Come nell'esempio precedente, questo non è sufficiente per avere un messaggio di output corretto e si dovrà di nuovo chiamare la mappa total.msgmap per calcolare i totali per messaggio di output.
I file di esempio si trovano nella cartella esql_calling_msgmap nel progetto Message Map Sample Message Flows.
Questo esempio mostra come chiamare una mappa da ESQL. La previsione è che gli utenti
chiameranno mappe secondarie piuttosto che mappe principali. Una mappa secondaria è
una qualsiasi mappa del messaggio destinata ad essere chiamata da un'altra mappa o da
ESQL. Si crea una mappa secondaria nella Procedura guidata Nuova mappa del messaggio
(File>Nuovo>Mappa del messaggio
) selezionando il pallino Questa mappa viene richiamata da un'altra mappa...:
La firma ESQL prevista per la chiamata a una mappa secondaria è:
submapName( sourcePath1, [sourcePath2, [...]] [targetPath, ] InputLocalEnvironment [, OutputLocalEnvironment])
E' sempre presente almeno un parametro sourcePath
;
questo rappresenta l'input di messaggistica che sta guidando il nodo del flusso di messaggi.
I sourcePath
sono variabili REFERENCE
ESQL
inizializzate per fare riferimento al nodo albero origine prima di chiamare la mappa
del messaggio.
targetPath
è una variabile REFERENCE
ESQL facoltativa
che fa riferimento al nodo albero root di destinazione. Deve essere inizializzata
prima di chiamare la mappa del messaggio. targetPath
è
facoltativa e, se una mappa del messaggio non dispone di parametri target, la mappa
non creerà alcun output di messaggistica. Questo viene utilizzato per scenari di messaggio al
database relazionale, dove le mappe vengono chiamate da nodi Database
ESQL.
InputLocalEnvironament e OutputLocalEnvironment sono variabili
REFERENCE
ESQL inizializzate per i nomi di correlazione al nodo ESQL
associato. Le mappe del messaggio sono implementate come procedure ad ambito schema,
quindi non possono accedere direttamente ai nomi di correlazione.
Il codice di esempio inizializza i parametri richiesti e chiama la mappa.
I file di esempio si trovano nella cartella esql_calling_msgmap nel progetto Message Map Sample Message Flows.
E' stato implementato il modello di base di una chiamata ESQL ad una mappa. Il codice
MODULE
ESQL è stato scritto per inizializzare le
cartelle Proprietà
e Intestazioni
, creare i
riferimenti necessari e chiamare la mappa.
La mappa costruisce un singolo messaggio di output da tutte le
cartelle del nodo Aggregate
(Request1, Request2,
ecc). Poiché MODULE
ESQL si occupa delle proprietà e delle
intestazioni, tutto quello che resta da fare è copiare il contenuto di
LocalEnvironment.Aggregate.AgregateRequestFolderName
nel messaggio di output.
Questi scenari di esempio mostrano il modello di progettazione per la conversione di modelli Schema XML che utilizzano wildcard, estensioni e restrizioni di tipo, gruppi di sostituzione e gruppi di modello contenuto in una mappa del messaggio.
I file di esempio per l'elaborazione di elementi wildcard e attributi si trovano nella cartella multipart_messages nel progetto Message Map Sample Message Flows.
Gli elementi wildcard si gestiscono chiamando una mappa secondaria. Nella mappa secondaria, il nome
dell'elemento è protetto. Per elaborare nomi di elemento differenti dallo
stesso wildcard, utilizzare le righe if
, condition
e else
.
L'esempio implementa un semplice scenario di campo che si ripete, ma nel caso leggermente più complesso in cui l'origine che si ripete viene creata come messaggio multipart di brokers. Il messaggio multipart viene gestito come elemento wildcard dagli strumenti della mappa. Gli elementi wildcard vengono gestiti chiamando una mappa secondaria per ottenere il nome corretto dell'elemento.
Nella prima mappa, l'assieme di messaggio di destinazione è contenuto in una
riga for
. La riga for
opera sul
messaggio multipart che si ripete contenuto dal singolo messaggio di origine.
L'inclusione dell'assieme di destinazione nella riga for
indica che assiemi di messaggio completi verranno emessi, uno per messaggio multipart
di input nell'origine. La prima mappa del messaggio contiene anche
una mappatura per il messaggio wildcard che supporta messaggi multipart. Questa
mappatura chiama una mappa secondaria, che deve restituire una definizione completa
dell'elemento che wildcard rappresenta.
Nella seconda mappa, si nota che l'elemento del messaggio wildcard è stato
vincolato ad essere un elemento rtl:body
. In questa mappa secondaria,
l'origine e la destinazione sono uguali e l'origine è copiata completamente per creare
la destinazione.
Il file di esempio per questo scenario è type_to_substitutiongroup.msgmap ubicato nella cartella xmlschema nel progetto Message Map Sample Message Flows.
Nell'editor della mappa del messaggio, 'cartelle' speciali dell'albero di origine e destinazione vengono utilizzate per mostrare le combinazioni di tipi valide. Il nome della cartella è specializzazioni per tipo base. All'interno della cartella vengono visualizzati gli elementi combinati con ogni derivazione non astratta dal tipo base. Ognuna di queste rappresentazioni di elementi concreti contiene il contenuto completo; con tutti i possibili attributi seguiti da tutti gli elementi validi. Essenzialmente, l'albero mostra gli elementi XML differenti che il modello di schema XML descrive.
Nella mappa del messaggio di esempio, l'origine è descritta utilizzando un modello di schema XML
che consente le alternative extensionType1
ed
extensionType2
. Ognuna di queste alternative può essere mappata singolarmente
alla destinazione.
Le gerarchie delle estensioni di tipo possono essere combinate con modelli di scelta, gruppi di sostituzione, ecc., anche se l'esempio evita tale complicazione.
Il file di esempio per questo scenario è type_to_substitutiongroup.msgmap ubicato nella cartella xmlschema nel progetto Message Map Sample Message Flows.
Nell'editor della mappa del messaggio, 'cartelle' speciali dell'albero di origine e destinazione vengono utilizzate per mostrare gli elementi validi che utilizzano le combinazioni di gruppi di sostituzione. Il nome della cartella è sostituzioni per elemento di testa. All'interno della cartella vengono visualizzati i nomi di elemento differenti combinati con ogni derivazione non astratta per il tipo base. Ognuna di queste rappresentazioni di elementi concreti contiene il contenuto completo; con tutti i possibili attributi seguiti da tutti gli elementi validi. Essenzialmente, l'albero mostra gli elementi XML differenti che il modello di schema XML descrive.
Nella mappa del messaggio di esempio, la destinazione viene descritta utilizzando un modello di schema XML
che consente le alternative Substitute1
e Substitute2
all'elemento HeadElement
astratto. Ognuna
di queste alternative può essere mappata singolarmente all'origine.
I gruppi di sostituzione possono essere combinati con le gerarchie di tipo, anche se l'esempio evita questa complicazione.
I file di esempio per questo scenario si trovano nella cartella modelgroups nel progetto Message Map Sample Message Flows.