• Non ci sono risultati.

2.3 Il framework Apache Muse

2.3.4 Il Router

L’elemento <router/>, contiene i dati relativi alla configurazione delle seguenti cose:

1. <logging/> Il sistema di logging dove i messaggi sono memorizzati.

2. <java-router-class/> Le classi Java che implementano il router.

3. <persistence/> Il meccanismo (opzionale) di persistenza dove memo-rizzare le router entries.

<router> <java-router-class> org.apache.muse.core.routing.SimpleResourceRouter </java router-class> <logging> <log-file>log/muse.log</log-file> <log-level>FINE</log-level> </logging> <persistence> <java-persistence-class> org.apache.muse.core.routing.RouterFilePersistence </java-persistence-class> <persistence-location>router-entries</persistence-location> </persistence> </router> Logging

Il sistema di Logging è realizzato tramite le JDK logging API. I due elementi <log-ging/> <log-file/> e <log-level/> consentono di specificare rispettivamente se il file di log Muse sarà scritto e a quale livello di dettaglio.

Il log file path deve essere relativo alla directory di lavoro corrente del l’applica-zione; nel caso di J2EE, questo è la root del WAR, nel caso di OSGI è la root del bundle. Nella successiva implementazione verrà creata infatti un log file nella cartella /OSGI-ROOT/log/muse.log. Questo file sarà sovrascritto(overwritten) ogni volta che l’applicazione viene riavviata.

Il log level deve essere uno dei valori previsti nel JDK log level enumeration: OFF, SEVERE, WARNING, etc. La lista completa si trova nel descriptor’s XML schema come anche le API documentation per il java.util.logging.Level.

<xs:element name=“log-level”> <xs:simpleType> <xs:restriction base=“xs:string”> <xs:enumeration value=“OFF”/> <xs:enumeration value=“SEVERE”/> <xs:enumeration value=“WARNING”/> <xs:enumeration value=“INFO”/> <xs:enumeration value=“CONFIG”/> <xs:enumeration value=“FINE”/> <xs:enumeration value=“FINER”/> <xs:enumeration value=“FINEST”/> <xs:enumeration value=“ALL”/> </xs:restriction> </xs:simpleType> </xs:element>

Il livello di logging di default è INFO. In questo caso verranno stampati sia messaggi di errore e stacktrace per ogni errore verificatosi durante la fase di inizializzazione o request handling, sia messaggi di conferma relativi se pre alla fase di inizializzazione. Incrementando il livello di logging a FINE (un livello più alto) sarà possibile memorizzare anche ogni messaggio SOAP di richiesta e di risposta processato. In questo caso log messages da entrambi i router e resource

instances verranno visualizzate side-by-side. Il fatto che il sistema di logging è configurato al livello di router significa che queste impostazioni vengono applicate a tutti le resource types menzionate nel descrittore.

Router Class

Il componente router di Muse mappa WS-Addressing headers da SOAP request in chiamate a metodi java delle resource instance. Quando un messaggio SOAP arriva all’applicazione, la classe che implementa il servizio eseguirà i seguenti passi:

• Effettua il parse del messaggio SOAP all’interno di una strutttura dati ed estrae i WS-Addressing headers.

• Fornisce un pre-request (pre-thread) context dove il router e gli altri com-ponenti possono condividere l’informazione su queste richieste.

• Viene estratto il WS-Addressing information e il SOAP body (XML) dal router.

Una volta ottenute queste informazioni il router può svolgere i seguenti tasks: • Ricerca la collezione di resource instance per trovare quella associata con

il dato addressing data.

• Verifica se la resource è in grado di gestire l’azione specificata nel messag-gio; in questo caso, chiede alla resource di invocare tale azione usando il SOAP body come input.

• Il router prende il valore di ritorno del metodo e lo passa di nuovo al servizio che lo inserisce nel SOAP envelope e invia la risposta al chiamante.

Si noti che la resource gestisce tutti i processamenti del SOAP body il router si occupa solo delle intestazioni SOAP e della semantica di WS-Addressing. In questo modo è possibile limitare le modifiche da apportare all’implementazione del router, anche se questa operazione risulta essere particolarmente semplice se si utilizza il deployment descriptor.

L’elemento <java-router-class/> specifica il nome della classe Java che im-plementa il router component. Questa classe deve imim-plementare l’interfaccia

org.apache.muse.core.routing.ResourceRouter. L’implementazione di default di questa inter-faccia èorg.apache.muse.core.routing.SimpleResourceRouter.

Persistence

Il Muse deployment descriptor permette di configurare un persistence layer per memorizzare le router’s entry (mapping EPR-to-resource) e per effettuarne il reload dopo che l’host viene riavviato(restarted).

Questo meccanismo è generico in quanto non definisce uno specifico datastore per memorizzare le entries ma è possibile usare un semplice file oppure utilizzare un sistema più complesso basato su Database. Muse offre un’implementazione di default del router di persistenza che si basa sul filesystem, il quale memorizza un file unico per ogni EPR nel router e ordina i file per resource type. E’ possibile uti-lizzare questo tipo di soluzione per iniziare per poi sostituirla con qualcosa di più performante, se necessario. Per abilitare il meccanismo di persistenza per le rou-ter entries, bisogna inizialmente aggiungere l’elemento opzionale <persistence/> sotto <router/>. Questo elemento è composto da due child elements:

• <persistence-location/> L’URI che descrive dove le router entries sa-ranno memorizzate.

• <java-persistence-class/> La classe Java che implementa le Router-Persistence API.

Nel caso si utilizzi l’implementazione di default del meccanismo della persisten-za, la location è data dal path relativo della directory dove si vogliono me-morizzare le entries. Se viene configurato il valore di <persistence-location/> a router-entries, allora un’applicazione OSGI-based creerà la directory /OSGI-ROOT/router-entries.

Il nome della classe Java responsabile dell’implementazione di default è:

org.apache.muse.core.routing.RouterFilePersistence . E’ possibile estendere o sostituire tale classe per modificare rispettivamente il tipo e il comportamento del meccanismo di persistenza.

Documenti correlati