SeamFramework.orgCommunity Documentation

Capitolo 39. Seam su Weblogic di BEA

39.1. Installazione e operatività di Weblogic
39.1.1. Installare la versione 10.3
39.1.2. Creazione del dominio Weblogic
39.1.3. Come avviare/arrestare/accedere il dominio
39.1.4. Impostazione del supporto JSF in Weblogic
39.2. L'esempio jee5/booking
39.2.1. I problemi di Weblogic con EJB3
39.2.2. Far funzionare l'esempio jee5/booking
39.3. L'esempio booking con jpa
39.3.1. Build e deploy dell'esempio booking con jpa
39.3.2. Differenze con Weblogic 10.x
39.4. Deploy di un'applicazione creata con seam-gen su Weblogic 10.x
39.4.1. Eseguire il setup di seam-gen
39.4.2. Cosa cambiare per Weblogic 10.X
39.4.3. Build e deploy dell'applicazione

Weblogic 10.3 è l'ultimo server JEE5 stabile proposto da BEA. Le applicazioni Seam possono essere sviluppate e installate sui server Weblogic, e questo capitolo vi mostrerà in che modo. Ci sono alcuni problemi noti da aggirare relativi ai server Weblogic e alcune modifiche alle configurazioni che sono specifiche di Weblogic.

Innanzitutto bisogna scaricare Weblogic, installarlo e avviarlo. Quindi passeremo a parlare dell'esempio JEE5 di Seam e deigli ostacoli da superare per farlo funzionare. Dopo di ché, installeremo l'esempio JPA. Infine creeremo un'applicazione seam-gen e la faremo girare per fornire un punto di partenza alla vostra applicazione.

Prima di tutto bisogna installare il server. Ci sono alcuni problemi non trascurabili che non sono stati affrontati nella 10.3, che tuttavia risolve alcuni di quelli discussi sotto senza dover installare le patch di BEA. E' disponibile anche il precedente rilascio, 10.0.MP1, che, tuttavia, richiede le patch di BEA per funzionare correttamente.

Il jar speciale jboss-seam.jar per il supporto EJB in Weblogic

A partire da Seam 2.0.2.CR2 per Weblogic è stato creato un jar speciale che non contiene il TimerServiceDispatcher . Questo è l'EJB che usa varargs e presenta il secondo problema relativo agli EJB. Ci troveremo ad usare questo jar per l'esempio jee5/booking, poiché evita i noti problemi di BEA.

Ecco velocemente i passi necessari ad installare Weblogic 10.3. Per maggiori dettagli e nel caso si presentino dei problemi,vi preghiamo di consultare i documenti BEA all'indirizzo Weblogic 10.3 Doc Center . Qui verrà installata la versione RHEL 5 usando l'installazione grafica:

  1. Si segua il link alla 10.3 indicato sopra e si scarichi la versione adatta al proprio ambiente. Sarà necessario creare un account Oracle per portare a termine l'operazione.

  2. Può essere necessario rendere eseguibile il file server103_XX.bin:

    chmod a+x server103_XX.bin
  3. Eseguite l'installazione:

    ./server103_XX.bin
  4. Quando l'installazione grafica è caricata, bisogna impostare il percorso della home directory di BEA. Questo è il punto dove sono installate tutte le applicazioni BEA. In questo documento tale punto sarà identificato con $BEA_HOME, ad esempio:

    /jboss/apps/bea
  5. Come tipo di installazione bisogna selezionare Complete. Non c'è bisogno di tutti gli extra dell'installazione competa (come le librerie struts e beehive), ma non farà alcun male.

  6. Nella pagina successiva è possibile lasciare i valori predefiniti delle posizioni di installazione dei componenti.

Ora che si è installato il server e creato il dominio, bisogna imparare ad avviarlo ed arrestarlo, oltre ad accedere alla console di configurazione.

Queste sono le istruzioni per installare e configurare le librerie JSF 1.2 di Weblogic. Weblogic non viene distribuito con le librerie JSF preinstallate. Per i dettagli completi si veda Weblogic 10.3 Configuring JSF and JSTL Libraries

  1. Nella console di amministrazione navigate alla pagina Deployments usando il menù sul lato sinistro.

  2. A questo punto prenmete il pulsante Install in cima alla tabella dei deployment

  3. Usando il browser delle directory navigate alla directory $BEA_HOME/wlserver_10.3/common/deployable-libraries . Selezionate l'archivio jsf-1.2.war, e cliccate il pulsante Next.

  4. Accertatevi che sia selezionata l'opzione Install this deployment as a library. Cliccate il pulsante Next della pagina Install Application Assistant.

  5. Premete il pulsante Next della pagina Optional Settings.

  6. Accertatevi che sia selezionata l'opzione Yes, take me to the deployment's configuration screen.. Cliccate il pulsante Finish della pagina Review your choices and click Finish.

  7. Nella pagina Impostazioni per jsf(1.2,1.2.3.1) impostate Deployment Order a 99 in modo che il supporto JSF venga installato prima delle applicazioni sottoposte ad autodeploy. Poi cliccate sul bottone Save.

Bisogna eseguire un altro passo per far funzionare il tutto. Per qualche motivo, anche eseguendo le operazioni precedenti, durante il deploy dell'applicazione non vengono trovate delle classi di jsf-api.jar. L'unico modo per ovviare al problema è di spostare javax.jsf_1.2.0.0.jar (il jsf-api.jar) da jsf-1.2.war nelle librerie condivise dei domini. Questo richiede il riavvio del server.

Si vuole usare Seam con gli EJB su Weblogic? In questo caso ci sono alcuni ostacoli da evitare o alcune patch di BEA ad installare. Questa sezione descrive questi ostacoli e quali modifiche apportare all'esempio jee5/booking per installarlo correttamente e farlo funzionare.

Per molte versione successive di Weblogic c'è stato un problema relativo a come Weblogic genera gli stub e a come compila gli EJB che usano argomenti variabili nei propri metodi. Problema confermato nelle versioni 9.X e 10.0.MP1. Purtroppo la versione 10.3 lo affronta solo parzialmente come dettagliato di seguito.

La spiegazione base del problema è che il compilatore EJB di Weblogic confonde i metodi che usano varargs con i metodi col modificatore transient. Quando BEA genera le proprie classi stub da quelle classi durante il deploy, esso non ha successo. Seam usa argomenti variabili in uno dei suoi EJB interni ( TimerServiceDispatcher). Se durante il deply si vedono eccezioni come quella riportata sotto, la versione corrente è la 10.0.MP1 senza patch.

java.io.IOException: Compiler failed executable.exec: 
/jboss/apps/bea/wlserver_10.0/user_projects/domains/seam_examples/servers/AdminServer
/cache/EJBCompilerCache/5yo5dk9ti3yo/org/jboss/seam/async/
TimerServiceDispatcher_qzt5w2_LocalTimerServiceDispatcherImpl.java:194: modifier transient 
not allowed here
  public transient javax.ejb.Timer scheduleAsynchronousEvent(java.lang.String arg0,
  java.lang.Object[] arg1)
                                   ^
/jboss/apps/bea/wlserver_10.0/user_projects/domains/seam_examples/servers/AdminServer
/cache/EJBCompilerCache/5yo5dk9ti3yo/org/jboss/seam/async/
TimerServiceDispatcher_qzt5w2_LocalTimerServiceDispatcherImpl.java:275: modifier transient
not allowed here
  public transient javax.ejb.Timer scheduleTimedEvent(java.lang.String arg0, 
  org.jboss.seam.async.TimerSchedule arg1, java.lang.Object[] arg2)

Questo problema è stato risolto con Weblogic 10.3 e BEA ha rilasciato una patch per Weblogic 10.0.MP1 ( CR327275 ) che può essere richiesta al loro supporto.

Purtroppo BEA ha verificato e annunciato un secondo problema.

Questo problema è comparso una volta applicata la patch CR327275 alla 10.0.MP1. Questo nuovo errore è stato confermato da BEA che ha creato una patch apposita per la 10.0.MP1. Questa patch viene identificata sia come CR370259 che come CR363182. Come l'altra, anche questa può essere richiesta al supporto BEA.

Questo difetto fa in modo che certi metodi EJB erroneamente non vengano inseriti nelle classi stub interne di Weblogic. Questo da luogo ai seguenti messaggi di errore durante il deploy.

<<Error
> <EJB
> <BEA-012036
> <Compiling generated EJB classes produced the following Java compiler error message:
<Compilation Error
> TimerServiceDispatcher_qzt5w2_Impl.java: The type TimerServiceDispatcher_qzt5w2_Impl must implement the inherited abstract method TimerServiceDispatcher_qzt5w2_Intf.scheduleTimedEvent(String, Schedule, Object[])
<Compilation Error
> TimerServiceDispatcher_qzt5w2_LocalTimerServiceDispatcherImpl.java: Type mismatch: cannot convert from Object to Timer
<Compilation Error
> TimerServiceDispatcher_qzt5w2_LocalTimerServiceDispatcherImpl.java: Type mismatch: cannot convert from Object to Timer
> 
<Error
> <Deployer
> <BEA-149265
> <Failure occurred in the execution of deployment request with ID '1223409267344' for task '0'. Error is: 'weblogic.application.ModuleException: Exception preparing module: EJBModule(jboss-seam.jar)

Sembra che, quando Weblogic 10.3 è stato rilasciato, si siano dimenticati di includere questa correzione!! Ciò significa che Weblogic 10.0.MP1 con le patch funzionerà correttamente, ma che la 10.3 richiederà ancora il jar speciale di Seam descritto sotto. Non tutti gli utenti si sono imbattuti in questo problema, e vi possono essere delle combinazioni OS/JRE in cui non si verifica, comunque è stato avvistato molte volte. Si spera che Oracle/BEA rilasceranno una patch aggiornata per questo difetto per la 10.3. Quando lo faranno aggiorneremo queste istruzioni come necessario.

In modo che gli utilizzatori di Seam possano fare il deploy di un'applicazione EJB su Weblogic, a partire da Seam 2.0.2.CR2, è stato creato un jar speciale apposta per Weblogic. Si trova nella directory $SEAM/lib/interop e si chiama jboss-seam-wls-compatible.jar. L'unica differenza tra questo jar e jboss-seam.jar è che il primo non contiene l'EJB TimerServiceDispatcher. Per usarlo basta cambiarne il nome in jboss-seam.jar e sostituire il jboss-seam.jar originale nel file EAR dell'applicazione. L'esempio jee5/booking ne fornisce una dimostrazione. Ovviamente con questo jar non sarà possibile usare le funzionalità di TimerServiceDispatcher.

In questa sezione passeremo in rassegna i passi necessari a preparare e far funzionare l'esempio jee5/booking.

Questo esempio usa il database hypersonic residente in memoria, e bisogna allestire il datasource in modo corretto. Per configurarlo la console di amministrazione si basa su un insieme di pagine in stile wizard.

  1. Bisogna copiare hsqldb.jar nella directory delle librerie condivise del dominio Weblogic: cp $SEAM_HOME/lib/hsqldb.jar $BEA_HOME/user_projects/domains/seam_examples/lib

  2. Avviate il server e navigate alla console amministrativa seguendo Sezione 39.1.3, «Come avviare/arrestare/accedere il dominio»

  3. Nell'albero di sinistra navigate a seam_examples - Services- JDBC - Data Sources.

  4. Poi selezionate il bottone New in cima alla tabella dei data source

  5. Compilate come segue:

    1. Name: seam-jee5-ds

    2. JNDI Name: seam-jee5-ds

    3. Database Type and Driver (Tipo di database e driver): other

    4. Premete il pulsante Next

  6. Cliccate il pulsante Next della pagina Transaction Options

  7. Compilate i campi seguenti della pagina Connection Properties (Proprietà di connessione):

    1. Database Name: hsqldb

    2. Host Name: 127.0.0.1

    3. Port: 9001

    4. Username: sa saranno campi password vuoti.

    5. Password: lasciare vuoto.

    6. Premete il pulsante Next

  8. Compilate i campi seguenti della pagina Connection Properties (Proprietà di connessione):

    1. Driver Class Name: org.hsqldb.jdbcDriver

    2. URL: jdbc:hsqldb:.

    3. Username: sa

    4. Password: lasciare vuoto.

    5. Lasciare il resto dei campi come sono.

    6. Premete il pulsante Next

  9. Scegliete il dominio di pertinenza del data source, nel nostro caso l'unico esistente AdminServer. Premete Next.

Bene - ora siamo finalmente pronti a cominciare a sistemare l'applicazione Seam per essere installata sul server Weblogic.

resources/META-INF/persistence.xml
resources/META-INF/weblogic-application.xml
resources/META-INF/ejb-jar.xml
resources/WEB-INF/weblogic.xml

Bisogna fare alcune modifiche allo script di build e al jar jboss-seam.jar, poi è possibile fare il deploy dell'applicazione.

Supponendo di scegliere la prima opzione per gestire il jboss-seam-wls-compatible.jar possiamo fare il build dell'applicazione lanciando ant archive nella directory di base dell'esempio jee5/booking.

Poichè si è scelto di creare il nostro dominio Weblogic in modalità sviluppo, è possibile fare il deploy dell'applicazione mettendo il file EAR nella directory degli autodeply dei domini.

cp ./dist/jboss-seam-jee5.ear
                  $BEA_HOME/user_projects/domains/seam_examples/autodeploy
               

Verifichiamo il funzionamento dell'applicazione all'indirizzo http://localhost:7001/seam-jee5/

Questo è l'esempio Hotel Booking implementato con i POJO di Seam con la JPA di Hibernate e non richiede il supporto EJB3 per funzionare. L'esempio ha già un insieme predisposto di configurazioni e script di build per molti dei container più comuni, incluso quelli di Weblogic 10.X

Innanzitutto faremo il build dell'esempio per Weblogic 10.x e completeremo i passi necessari a farne il deploy. Poi parleremo delle differenze tra le diverse versioni di Weblogic, e con la versione per JBoss.

Sinoti che questo esempio assume che le librerie JSF di Weblogic siano state configurate come descritto in Sezione 39.1.4, «Impostazione del supporto JSF in Weblogic».

Nel primo passo si allestisce il datasource, nel secondo si fa il build dell'applicazione e nel terzo si fa il deploy.

Quando Weblogic è stato installato seguendo Sezione 39.1.2, «Creazione del dominio Weblogic», abbiamo scelto di far operare il dominio in modalità sviluppo. Ciò significa che per fare il deploy basta copiare l'applicazione nella directory di autodeploy.

cp ./dist-weblogic10/jboss-seam-jpa.war
$BEA_HOME/user_projects/domains/seam_examples/autodeploy

Verifichiamo il funzionamento all'indirizzo http://localhost:7001/jboss-seam-jpa/ .

seam-gen è uno strumento molto utile agli sviluppatori per creare e far funzionare velocemente un'applicazione e fornisce le fondamenta cui aggiungere le proprie funzionalità. Di default seam-gen produrrà applicazioni configurate per essere eseguite su JBoss AS. Queste istruzioni mostreranno i passi necessari a farlo funzionare su Weblogic

seam-gen è stato realizzato per essere semplice così, come si può immaginare, il deploy di un'applicazione generata da seam-gen in Weblogic 10.x non è troppo difficile. Sostanzialmente consiste nell'aggiornamento o nell'eliminazione di alcuni file di configurazione e nell'aggiunta dei jar delle dipendenze di cui Weblogic 10.x non è dotata.

Questo esempio illustrerà il deploy seam-gen WAR di base. Mostrerà i componenti POJO di Seam, la JPA di Hibernate, i Facelets, la sicurezza di Drools, le RichFaces, e un datasource configurabile.

La prima cosa da fare è dare a seam-gen le informazioni riguardanti il progetto da creare. A questo scopo occorre eseguire ./seam setup nella directory di base della distribuzione di Seam. Si noti che qui i percorsi sono i nostri e devono essere liberamente adattati al vostro ambiente.

./seam setup
Buildfile: build.xml

init:

setup:
     [echo] Welcome to seam-gen :-)
    [input] Enter your Java project workspace (the directory that contains your 
Seam projects) [C:/Projects] [C:/Projects]
/home/jbalunas/workspace
    [input] Enter your JBoss home directory [C:/Program Files/jboss-4.2.3.GA] 
[C:/Program Files/jboss-4.2.3.GA]
/jboss/apps/jboss-4.2.3.GA
    [input] Enter the project name [myproject] [myproject]
weblogic-example
     [echo] Accepted project name as: weblogic_example
    [input] Select a RichFaces skin (not applicable if using ICEFaces) [blueSky]
 ([blueSky], classic, ruby, wine, deepMarine, emeraldTown, sakura, DEFAULT)

    [input] Is this project deployed as an EAR (with EJB components) or a WAR 
(with no EJB support) [ear]  ([ear], war, )
war
    [input] Enter the Java package name for your session beans [org.jboss.seam.
tutorial.weblogic.action] [org.jboss.seam.tutorial.weblogic.action]
org.jboss.seam.tutorial.weblogic.action
    [input] Enter the Java package name for your entity beans [org.jboss.seam.
tutorial.weblogic.model] [org.jboss.seam.tutorial.weblogic.model]
org.jboss.seam.tutorial.weblogic.model
    [input] Enter the Java package name for your test cases [org.jboss.seam.
tutorial.weblogic.action.test] [org.jboss.seam.tutorial.weblogic.action.test]
org.jboss.seam.tutorial.weblogic.test
    [input] What kind of database are you using? [hsql]  ([hsql], mysql, oracle,
 postgres, mssql, db2, sybase, enterprisedb, h2)

    [input] Enter the Hibernate dialect for your database [org.hibernate.
dialect.HSQLDialect] [org.hibernate.dialect.HSQLDialect]

    [input] Enter the filesystem path to the JDBC driver jar [/tmp/seamlib/hsqldb.jar] 
[/tmp/seam/lib/hsqldb.jar]

    [input] Enter JDBC driver class for your database [org.hsqldb.jdbcDriver] 
 [org.hsqldb.jdbcDriver]

    [input] Enter the JDBC URL for your database [jdbc:hsqldb:.] [jdbc:hsqldb:.]

    [input] Enter database username [sa] [sa]

    [input] Enter database password [] []

    [input] Enter the database schema name (it is OK to leave this blank) [] []

    [input] Enter the database catalog name (it is OK to leave this blank) [] []

    [input] Are you working with tables that already exist in the database? [n] 
 (y, [n], )

    [input] Do you want to drop and recreate the database tables and data in 
import.sql each time you deploy? [n]  (y, [n], )

    [input] Enter your ICEfaces home directory (leave blank to omit ICEfaces) [] []

[propertyfile] Creating new property file: 
/rhdev/projects/jboss-seam/cvs-head/jboss-seam/seam-gen/build.properties
     [echo] Installing JDBC driver jar to JBoss server
     [copy] Copying 1 file to /jboss/apps/jboss-4.2.3.GA/server/default/lib
     [echo] Type 'seam create-project' to create the new project

BUILD SUCCESSFUL

Digitate ./seam new-project per creare il progetto e cd /home/jbalunas/workspace/weblogic_example per vedere il progetto appena creato.

Innanzitutto bisogna modificare ed eliminare dei file di configurazione, poi bisogna aggiornare le librerie che sono installate insieme all'applicazione.

build.xml
resources/META-INF/persistence-dev.xml
resource/WEB-INF/weblogic.xml

Bisogna creare questo file e popolarlo come in description of WEB-INF/weblogic.xml.

resource/WEB-INF/components.xml

Vogliamo usare le transazioni JPA, quindi dobbiamo aggiungere quanto segue in modo che Seam ne sia informato.


<transaction:entity-transaction entity-manager="#{entityManager}"/>

Bisogna aggiungere anche il namespace delle transazioni e la posizione dello schema in cima al documento.


xmlns:transaction="http://jboss.com/products/seam/transaction"

http://jboss.com/products/seam/transaction http://jboss.com/products/seam/transaction-2.1.xsd
resource/WEB-INF/web.xml

WEB-INF/web.xml — Poiché il file jsf-impl.jar non si trova nel WAR bisogna configurare questo listener:



 <listener>
   <listener-class
>com.sun.faces.config.ConfigureListener</listener-class>
 </listener
>
resources/WEB-INF/jboss-web.xml

E' possibile eliminare questo file dal momento che non si sta per fare il deploy su JBoss AS ( jboss-app.xml è usato per abilitare l'isolamento del classloading in JBoss AS)

resources/*-ds.xml

E' possibile eliminare questi file poiché non si sta per fare il deploy in JBoss AS. Questi file definiscono i datasource di JBoss, mentre per Weblogic useremo la console amministrativa.

L'applicazione seam-gen ha dipendendenze delle librerie molto simili a quelle dell'esempio jpa visto sopra. Si veda Sezione 39.3.2, «Differenze con Weblogic 10.x». Sotto sono riportati i cambiamenti necessari a realizzare tali dipendenze in questa applicazione.

  • build.xml — Ora dobbiamo sistemare il file build.xml. Trovate il target war e aggiungete quanto segue in fondo al target.

    
    
          <copy todir="${war.dir}/WEB-INF/lib">
             <fileset dir="${lib.dir}">
                <!-- Misc 3rd party -->
                <include name="commons-logging.jar" />
                <include name="dom4j.jar" />
                <include name="javassist.jar" />
                <include name="cglib.jar" />
                <include name="antlr.jar" />

                <!-- Hibernate -->
                <include name="hibernate.jar" />
                <include name="hibernate-commons-annotations.jar" />
                <include name="hibernate-annotations.jar" />
                <include name="hibernate-entitymanager.jar" />
                <include name="hibernate-validator.jar" />
                <include name="jboss-common-core.jar" />
                <include name="concurrent.jar" />
             </fileset>
          </copy
    >

Rimane solo il deploy dell'applicazione. Questo equivale a preparare il datasource e fare il build e il deploy dell'applicazione.

La configurazione del datasource è molto simile a quella jee5 di Sezione 39.2.2.1, «Configurare il datasource hsql». Tranne per quanto qui indicato seguite le istruzioni del link.

  • DataSource Name: seam-gen-ds

  • JNDI Name: seam-gen-ds

Quando Weblogic è stato installato seguendo Sezione 39.1.2, «Creazione del dominio Weblogic», abbiamo scelto di far operare il dominio in modalità sviluppo. Ciò significa che per fare il deploy basta copiare l'applicazione nella directory di autodeploy.


cp  ./dist/weblogic_example.war /jboss/apps/bea/user_projects/domains/seam_examples/autodeploy

Verificate il funzionamento dell'applicazione all'indirizzo http://localhost:7001/weblogic_example/.