MokaByte 73- Aprile 2003 
Setup di architetture J2EE
Configurare una connessione a db con JBoss 2.4.x
di
Davide Brusamolino
JBoss è uno standards-compliant Enterprise JavaBeans application server implementato completamente in Java. Il progetto è cominciato nel 1999 come semplice EJB container, negli anni si è sviluppato ed è stato integrato con nuovi moduli fino a diventare il più popolare application server (circa 150.000 download per mese). Nel 2002 in una classifica redatta da JavaWorld (www.javaworld.com) è stato eletto il miglio application server dell'anno, avendo avversari del calibro di Bea e altri noti.

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

MokaByte® è un marchio registrato da MokaByte s.r.l. 
Java®, Jini® e tutti i nomi derivati sono marchi registrati da Sun Microsystems.
Tutti i diritti riservati. E' vietata la riproduzione anche parziale.
Per comunicazioni inviare una mail a info@mokabyte.it