Fabrizio Russo Creazione di un custom mediator


2017/01/24   Creazione di un custom mediator

L'infrastruttura di WSO2 e' molto potente ed offre diversi mediator per coprire la maggior parte dei casi ma ci sono occasioni in cui o realizzare una funzionalita' e' piuttosto compesso oppure proprio non ci si riesce.

Per fortuna, in questi casi, l'architettura lascia aperta la possibilita' di creare dei custom mediator dove poter realizzare tutto quello che si intende fare.

Per fare un esempio di realizzazione di un custom mediator, mostrero' di seguito come creare un tag "DUMP" che stampi a console/log tutte le property attualmente presenti.
Il tag fa grosso modo quello che si potrebbe ottenere con il mediator log impostanto a "full" l'attributo level.
La differenza in questa implementazione (oltre a dimostrare la tecnica per la realizzazione) e' che ogni property definita viene stampata su una sola riga invece che tutte insieme.

Creazione del progetto

Sebbene Developer Studio (Eclipse + plugin WSO2) consenta la creazione di un progetto adatto alla creazione di un custom mediator tramite il wizard attivabile da Developer Studio --> Open Dashboard --> Enterprise Service Bus --> Mediato Project

 

Questo wizard crea una struttura simile alla seguente :

 

Che consente di scrivere direttametne il codice del tag. Il jar che ne seguira' andra' poi copiato nella sotto cartella repository/components/lib della cartella di installazione dell' ESB.

Questo wizard include giĆ  tutte le classi base necessarie alla scrittura del Tag ma non prevede classi esterne che probabilmente potrebbero essere necessarie.

Per questo io preferisco creare un nuovo progetto java (semplice progetto java) ed includere manualmente i riferimenti a tutti i Jar presenti nella cartella lib dell' ESB in questo modo avro' direttamente accesso a TUTTE le librerie anche quelle, gia' presenti in WSO2 ma non referenziate dal wizard di creazione.

Le librerie da includere manualmente nel progetto sono tutte quelle presenti nella cartella repository/components/plugins disponibile direttamente all'interno della cartella dell' ESB.


Implementazione del mediator

Indipendenteme dalla struttura del progetto, quindi, l'implementazione del custom mediator di questo esempio, e' la seguente:


	public class Dump extends AbstractMediator {

	private String message = null;
	private String paramPrefix = "";
	
	
	public String getMessage() { return message; }
	public void setMessage(String message) { this.message = message; }
	public String getParamPrefix() { return paramPrefix; }
	public void setParamPrefix(String paramPrefix) { this.paramPrefix = paramPrefix; }
	
	@Override
	public boolean mediate(MessageContext mc) {
		SynapseLog synLog = getLog(mc);
		if (message != null) log.info("DUMP: " + message);
		Set<String> keySet = mc.getPropertyKeySet();
		for (String key : keySet) {
			if (paramPrefix != null && !key.startsWith(paramPrefix)) continue;
			String val = (String) mc.getProperty(key);
			log.info(" --> " + key + " = " + val);
		}
		return true;
	}

}

Il mediator tag estende direttamente la classe WSO2 AbstractMediator ed e' necessario implementare il metodo mediate(MessageContext mc).

Attraverso il MessageContext e' possibile accedere a tutte le variabili, ciclare e stamparle a video.
Per stamparle a video e' gia' disponibile il riferimento all'oggetto log che sia aggancia direttamente al livello di log definito nell' ESB.

Ultima nota, nella implementaione si fa riferimento a due proprieta' che e' possibile passare al mediator in modo da personalizzarne il funzionamento. Tali proprieta' saranno valorizzate attraverso il tag property nel'utilizzo del mediator.
Non rimane infine che utilizzare il tag all'interno dei propri script WSO2 con una sintassi tipo


<class name="it.frusso.wso2.Dump">	
  <property name="message" value="Dump delle variabili" />
</class>