Introduzione
JBoss è un application server compatibile agli
standard Enterprise JavaBeans completamente sviluppato
in Java e scaricabile gratuitamente dal sito www.jboss.org.
Le parti che compongono JBOSS sono:
1)EJB container
2)supporto a JMX
3)JBossMQ per JMS
4)JBossMail per Java Mail
5)JBossTX per il supporto alle transazioni
6)JBossSX per JAAS
7)JBossCX per JCA
8)JBossCMP per CMP
Uno
dei successi di JBoss deriva dalla metodologia di programmazione
con la quale è stato pensato basata su JMX (Java
Management eXtension) che è il mezzo migliore
per ottenere del software integrabile. JMX fornisce
un 'aggancio' comune sul quale poter inserire moduli,
contenitori e plugins che costituiscono JBoss, ma permette
anche di estendere queste moduli da parte dell'utente.
Struttura
di Jboss 2.4.x
Ottenuto
il file .zip o .tar e de-compattato si ottiene la seguente
struttura di directories:
Figura 1
Il file jboss.jcml
Questo
file posto nella directory conf contiene la configurazione
di tutti gli mbean che costituiscono JBoss.
Il formato di questo file è di tipo xml e inizialmente
può sembrare difficoltoso metterci le mani.
Fortunatamente si ha un ottima guida data dai commenti
che specificano la funzionalità di quel particolare
mbean.
In particolare in questo articolo siamo interessati
al mbean per la connessione a db identificato dal seguente
commento:
<!--
====================================================================
-->
<!-- JDBC -->
<!-- ====================================================================
-->
Di
default viene fornita una configurazione per gestire
un pool di connessione a HypersonicDB che come detto
è il db di default utilizzato da JBoss.
Di seguito vediamo gli mbean configurati:
<mbean
code="org.jboss.jdbc.JdbcProvider" name="DefaultDomain:service=JdbcProvider">
<attribute name="Drivers">org.hsqldb.jdbcDriver</attribute>
</mbean>
<mbean
code="org.jboss.jdbc.HypersonicDatabase" name="DefaultDomain:service=Hypersonic">
<attribute name="Port">1476</attribute>
<attribute name="Silent">true</attribute>
<attribute name="Database">default</attribute>
<attribute name="Trace">false</attribute>
</mbean>
<mbean
code="org.jboss.jdbc.XADataSourceLoader" name="DefaultDomain:service=XADataSource,name=DefaultDS">
<attribute name="PoolName">DefaultDS</attribute>
<attribute name="DataSourceClass">
org.jboss.pool.jdbc.xa.wrapper.XADataSourceImpl</attribute>
<attribute name="Properties"></attribute>
<attribute name="URL">jdbc:hsqldb:hsql://localhost:1476</attribute>
<attribute name="GCMinIdleTime">1200000</attribute>
<attribute name="JDBCUser">sa</attribute>
<attribute name="MaxSize">10</attribute>
<attribute name="Password" />
<attribute name="GCEnabled">false</attribute>
<attribute name="InvalidateOnError">false</attribute>
<attribute name="TimestampUsed">false</attribute>
<attribute name="Blocking">true</attribute>
<attribute name="GCInterval">120000</attribute>
<attribute name="IdleTimeout">1800000</attribute>
<attribute name="IdleTimeoutEnabled">false</attribute>
<attribute name="LoggingEnabled">false</attribute>
<attribute name="MaxIdleTimeoutPercent">1.0</attribute>
<attribute name="MinSize">0</attribute>
<attribute name="ReleaseOnCommit">false</attribute>
<attribute name="SaveStackTrace">false</attribute>
</mbean>
In
particolare se voglio interfacciarmi ad un nuovo db
es. a MySQL devo commentare ( <! --codice -- >)
questa parte e sostituirla con la seguente:
<mbean
code="org.jboss.jdbc.JdbcProvider" name="DefaultDomain:service=JdbcProvider">
a)
<attribute name="Drivers">org.gjt.mm.mysql.Driver</attribute>
</mbean>
b)
<mbean code="org.jboss.jdbc.XADataSourceLoader"
name="DefaultDomain:service=XADataSource,name=MySqlDS">
b1)
<attribute name="PoolName"> MySqlDS
</attribute>
<attribute name="DataSourceClass">
org.jboss.pool.jdbc.xa.wrapper.XADataSourceImpl
</attribute>
<attribute name="Properties"></attribute>
c)
<attribute name="URL">jdbc:mysql://localhost:3306/lavazza</attribute>
<attribute name="GCMinIdleTime">1200000</attribute>
<attribute name="MaxSize">10</attribute>
<attribute name="GCEnabled">false</attribute>
<attribute name="InvalidateOnError">false</attribute>
<attribute name="TimestampUsed">false</attribute>
<attribute name="Blocking">true</attribute>
<attribute name="GCInterval">120000</attribute>
<attribute name="IdleTimeout">1800000</attribute>
<attribute name="IdleTimeoutEnabled">false</attribute>
<attribute name="LoggingEnabled">false</attribute>
<attribute name="MaxIdleTimeoutPercent">1.0</attribute>
<attribute name="MinSize">0</attribute>
</mbean>
Gli
interventi da fare sono minimi:
a) Devo includere il file .jar contenente i driver specifici
di MySql nella directory lib/ext. In questa maniera
qualsiasi applicazione può utilizzare questi
driver
b) b1) Di default JBoss utilizza come JNDI name per
identificare la risorsa db il nome DefaultDS. Per cambiarlo
come nel nostro caso sostituisco il nuovo nome a DefaultDS.
c) E' la stringa di connessione da db
d)
Se ho anche uno username e una password per la connessione
a db devo aggiungere altri due tag
<attribute
name="Password" >password</attribute>
<attribute name="JDBCUser">username</attribute>
A
questo punto a livello di codice (classe Entity Bean)
:
private
Connection getConnection() {
try {
Context in = new InitialContext();
DataSource ds = (DataSource)in.lookup("java:comp/env/jdbc/MySqlDS
");
return ds.getConnection();
}
catch(Exception e){
e.printStackTrace();
}
return null;
}
dove
il percorso comp/env mi identifica application componet
environment (ENC) associata alla mia applicazione.
Le classi qui utilizzate fanno parte dell'estensione
(JNDI) standard della piattaforma Java che permettono
di avere il servizio di namig e directory per la piattaforma
J2EE. JBossNS è un esempio di implementazione
di JNDI basato sulle classi SPI (service provider implementation).
Nelle API JNDI fra le altre classi troviamo la classe
InitialContext, Context etc.
Quando voglio ottenere il contesto associato al mio
servizio di namig il punto di partenza mi è dato
dalla classe InitialContext.
Quando creo un InitialContext esso viene inizializzato
con delle proprieta; se uso il costruttore di default
l'inizializzazione avviene tramite il file jndi.properties
anch' esso presente nella directory conf.
Qui vediamo il contenuto del file:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=jnp://localhost:1099/
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
Il
vantaggio che mi deriva è che ho la possibilità
di accedere ad una risorsa es. il db solo riferendomi
ad esso attraverso un nome es. MySqlDS e senza conoscere
i dettagli del db ovvero ho un'astrazione della risorsa
fisica riconducibile al mio nome logico. Se un domani
cambiassi database da MySQL a Oracle non cambierei il
mio codice ma continuerei a riferirmi alla mia risorsa
sempre attraverso un nome logico.
Il passaggio avverrebbe modificando il file jboss.jcml.
Altro vantaggio è che lasciando la gestione del
pool di connessioni a JBoss non mi devo preoccupare
di gestire da codice il pool stesso con i relativi vantaggi
in termini di tempo di programmazione e complessità
dell'applicativo stesso.
File jboss.xml
Un
ulteriore passo da fare a questo punto è quello
di aggiungere specifiche funzionali dipendenti dal particolare
application server a quelle standard ottenute dal deploy
del mio EJB (file ejb-jar.xml).
Per far questo devo creare un nuovo file di nome jboss.xml
e introdurlo nella directory META-INF del file .jar
ottenuto dal deploy del mio EJB.
Un esempio:
<?xml
version="1.0" encoding="Cp1252"?>
<jboss>
<secure>false</secure>
<container-configurations>
<container-configurations>
<commit-option>C</commit-option>
</container-configurations>
</container-configurations>
<resource-managers />
<enterprise-beans>
<session>
<ejb-name>ConnectBean</ejb-name>
<jndi-name>ConnectBean</jndi-name>
<resource-ref>
<res-ref-name>jdbc/MySqlDS </res-ref-name>
<jndi-name>java:/MySqlDS </jndi-name>
</resource-ref>
</session>
</enterprise-beans>
</jboss>
Conclusioni
Sicuramente JBoss rappresenta una valida alternativa
agli application server presenti sul mercato e non ha
niente da invidiare ai sui più diretti avversari,
anzi essendo completamente gratuito ( per maggiori dettagli
vedi sito www.jboss.org) può contenere gli eventuali
costi di un applicativo.
Di contro ha che la documentazione gratuita è
molto lacunosa ed inoltre non ha interfacce che facilitano
l'utente nella configurazione.
Bibliografia
[1] * Manual - online HTML version- www.jboss.org
|