Domanda

Come parte di un aggiornamento da JBoss 4.0.4 a 5.1, sto cercando di ottenere un WAR da distribuire dopo un EAR viene distribuito con successo. JBoss 5.x non supporta PrefixDeploymentSorter come fece 4.x, il che significa che ho è necessario utilizzare in jboss-web.xml della guerra.

Sembra che io non può dipendere dalla EAR in sé, quindi prendo invece l'ultimo EJB distribuito. Questo EJB fornisce una voce JNDI che la guerra ha bisogno.

Ecco l'EJB come si distribuisce quando la guerra è assente dalla directory deploy:

2010-03-25 10:47:30,348 INFO  [org.jboss.ejb3.session.SessionSpecContainer] (main) Starting jboss.j2ee:ear=my-ear.ear,jar=mypackage-ejb.jar,name=MyFacadeBean,service=EJB3
2010-03-25 10:47:30,350 INFO  [org.jboss.ejb3.EJBContainer] (main) STARTED EJB: my.package.MyFacadeBean ejbName: MyFacadeBean
2010-03-25 10:47:30,371 INFO  [org.jboss.ejb3.proxy.impl.jndiregistrar.JndiSessionRegistrarBase] (main) Binding the following Entries in Global JNDI:

        my/MyFacade/local - EJB3.x Default Local Business Interface
        my-ear/MyFacadeBean/local-my.package.MyFacade - EJB3.x Local Business Interface

Ed ecco il frammento di dipende da jboss-web.xml:

<depends>jboss.j2ee:ear=my-ear.ear,jar=mypackage-ejb.jar,name=MyFacadeBean,service=EJB3</depends>

Il mio problema è: la guerra inizia a distribuire subito dopo "INIZIATO EJB:", vale a dire prima che MyFacadeBean è destinata a JNDI, che fa sì che le implementazioni di fagioli a fallire:

2010-03-25 10:47:39,068 ERROR [my.facade.FacadeFactory] (main) MyFacade not bound
2010-03-25 10:47:39,069 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[my.host.no].[/]] (main) StandardWrapper.Throwable
java.lang.ExceptionInInitializerError
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:164)
        at my.freemarker.servlet.FreemarkerController.setupPojoServiceFactory(FreemarkerController.java:621)
[...]
Caused by: java.lang.RuntimeException: javax.naming.NameNotFoundException: MyFacade not bound
        at my.facade.FacadeFactory.getFacade(FacadeFactory.java:61)

Dopo la guerra ha finito il suo dispiegamento, MyFacade felicemente (beffardamente?) Continua la sua implementazione e lega le voci JNDI.

Se io hot-distribuire il guerra dopo l'EAR ha schierato, tutto funziona come previsto.

Ho anche pensato di dipendere da un'EJB manichino nelle orecchie, e l'utilizzo di rigoroso in jboss-app.xml per costringerlo a caricare come ultimo modulo. Ma, ahimè, JBoss 5.x non sostenere che sia. Doh!

C'è un modo dipendere dalla voce di JNDI in sé? Ci sono altri modi di risolvere questo?

È stato utile?

Soluzione

Ecco come si può raggiungere questo su JBoss 5.1.x.

In primo luogo, aggiungere un file chiamato aliases.txt nella directory META-INF del vostro orecchio. Questo file deve solo contenere una sola riga con un arbitrario nome / identificatore per il vostro orecchio. Ad esempio, se si dispone di my-ear.ear, il file potrebbe contenere META-INF/aliases.txt 'my-ear'. Ha solo bisogno di essere qualcosa che non si scontreranno con altri alias dichiarati da altre applicazioni schierati sullo stesso server.

Quindi, aggiungere un file jboss-dependency.xml nella directory META-INF del WAR, contenente le seguenti (subsituting 'my-ear' per l'alias creato in precedenza):

<dependency xmlns="urn:jboss:dependency:1.0">
  <item whenRequired="Real" dependentState="Create">my-ear</item>
</dependency>

Ciò garantirà l'EAR viene distribuito prima della guerra.

Inoltre, se si tenta di distribuire la guerra senza essere presente l'EAR, JBoss registrerà un messaggio di errore distribuzione chiara raccontandovi la dipendenza mancante.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top