Pregunta

Como parte de una actualización de JBoss 4.0.4 a 5.1, estoy intentando implementar un WAR después de que un EAR se haya implementado exitosamente.JBoss 5.x no es compatible Clasificador de implementación de prefijo como lo hizo 4.x, lo que significa que tengo que usar <depende> en jboss-web.xml de WAR.

parece que yo no puede depender del EAR mismo, por lo que elijo el último EJB implementado.Este EJB proporciona una entrada JNDI que WAR necesita.

Aquí está el EJB tal como se implementa cuando WAR no está en el directorio de implementación:

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

Y aquí está el fragmento dependiente de jboss-web.xml:

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

Mi problema es:La WAR comienza a desplegarse inmediatamente después de "STARTED EJB:", es decirantes de que MyFacadeBean esté vinculado a JNDI, lo que provoca que fallen las implementaciones de beans:

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)

Después de que WAR haya terminado su implementación, MyFacade felizmente (¿burlonamente?) continúa su implementación y vincula las entradas JNDI.

Si implemento WAR en caliente después de que se haya implementado EAR, todo funciona según lo previsto.

Incluso pensé en depender de un EJB ficticio en el EAR y usar <module-order>strict</module-order> en jboss-app.xml para forzar que se cargara como el último módulo.Pero Ay, JBoss 5.x no soporta eso cualquiera.¡Doh!

¿Hay alguna manera de depender de la propia entrada JNDI?¿Hay otras formas de solucionar esto?

¿Fue útil?

Solución

Así es como se puede lograr esto en JBoss 5.1.x.

En primer lugar, añadir un archivo llamado aliases.txt en el directorio META-INF de su oído. Este archivo solo debe contener una sola línea con un nombre arbitrario / identificador para el oído. Por ejemplo, si usted tiene mi-ear.ear, el archivo podría contener META-INF/aliases.txt 'my-ear'. Simplemente tiene que ser algo que no entrará en conflicto con cualquier otro alias declaradas por otras aplicaciones desplegadas en el mismo servidor.

A continuación, añadir un archivo al directorio jboss-dependency.xml META-INF de la GUERRA, que contiene los siguientes (subsituting 'my-ear' para el alias que creó anteriormente):

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

Esto asegurará que la EAR se despliega antes de la guerra.

Además, si intenta implementar la guerra sin la EAR estar presente, JBoss registrará un mensaje de error de implementación clara que le dice acerca de la dependencia faltante.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top