1 Reply Latest reply on Mar 20, 2012 9:30 AM by etano

    AS 6.1 EJB dependencies

    etano

      Hi,

       

      I'm having some difficulties after switching a legacy project from EJB2.1 with JBoss 5.0 to EJB3 with JBoss AS 6.1. I do have lots of EJB modules, and there are dependencies among the EJBs. I was under the impression by declaring a dependency (with @EJB) this would affect the deployment order, which does not seem to be true.

       

      Suppose you have the following EAR structure:

       

      my.ear

      - ejb1.jar

      |- Bean1 (SLSB)

      - ejb2.jar

      |- Bean2 (SLSB)

      - (... more EJB modules)

       

      Now Bean2 needs Bean1. This will look like this:

       

      ejb1.jar:

      {code}@Stateless(name="Bean1")

      public Bean1 {

      ...

      }

      {code}

       

      ejb2.jar:

      {code}@Stateless(name="Bean2")

      @EJB(beanInterface=package1.Bean1.class, name="Bean1")

      public Bean2 {

      ...

      }

      {code}

       

      What I see in the log is:

       

      {code}15:16:57,230 INFO  [JBossASKernel] installing bean: jboss.j2ee:ear=my.ear,jar=ejb2.jar,name=Bean2,service=EJB3

      15:16:57,230 INFO  [JBossASKernel]   with dependencies:

      15:16:57,230 INFO  [JBossASKernel]   and demands:

      15:16:57,230 INFO  [JBossASKernel]     jboss-switchboard:appName=my,module=ejb2,name=Bean2; Required: Create

      15:16:57,230 INFO  [JBossASKernel]     jboss.ejb:service=EJBTimerService; Required: Described

      15:16:57,230 INFO  [JBossASKernel]     jboss-injector:topLevelUnit=my.ear,unit=ejb2.jar,bean=Bean2,interceptor=org.jboss.weld.integration.ejb.interceptor.Jsr299BindingsInterceptor; Required: Described

      15:16:57,231 INFO  [JBossASKernel]     jboss-injector:topLevelUnit=my.ear,unit=ejb2.jar,bean=Bean2,interceptor=org.jboss.weld.integration.ejb.SessionBeanInterceptor; Required: Described

      15:16:57,231 INFO  [JBossASKernel]     jboss-injector:topLevelUnit=my.ear,unit=ejb2.jar,bean=Bean2; Required: Described

      15:16:57,231 INFO  [JBossASKernel]   and supplies:

      15:16:57,231 INFO  [JBossASKernel]     jndi:ejb2/Bean2/local

      15:16:57,231 INFO  [JBossASKernel]     Class:package2.Bean2

      15:16:57,231 INFO  [JBossASKernel]     jndi:Bean2

      15:16:57,231 INFO  [JBossASKernel] Added bean(jboss.j2ee:ear=my.ear,jar=ejb2.jar,name=Bean2,service=EJB3) to KernelDeployment of: ejb2.jar

      ...

      15:16:57,268 INFO  [JBossASKernel] installing bean: jboss.j2ee:ear=my.ear,jar=ejb1.jar,name=Bean1,service=EJB3

      15:16:57,268 INFO  [JBossASKernel]   with dependencies:

      15:16:57,268 INFO  [JBossASKernel]   and demands:

      15:16:57,268 INFO  [JBossASKernel]     jboss.ejb:service=EJBTimerService; Required: Described

      15:16:57,268 INFO  [JBossASKernel]     jboss-switchboard:appName=my,module=ejb1,name=Bean1; Required: Create

      15:16:57,268 INFO  [JBossASKernel]     jboss-injector:topLevelUnit=my.ear,unit=ejb1.jar,bean=Bean1; Required: Described

      15:16:57,268 INFO  [JBossASKernel]   and supplies:

      15:16:57,269 INFO  [JBossASKernel]     Class:package1.Bean1

      15:16:57,269 INFO  [JBossASKernel]     jndi:my/Bean1/local-package1.Bean1

      15:16:57,269 INFO  [JBossASKernel]     jndi:Bean1

      15:16:57,269 INFO  [JBossASKernel] Added bean(jboss.j2ee:ear=my.ear,jar=ejb1.jar,name=Bean1,service=EJB3) to KernelDeployment of: ejb1.jar

      {code}

       

      There is no dependency on ejb1/Bean1 noted. Also, the deployment does not seem to honor the dependency either.

       

      In Bean2 I will at some point perform a JNDI lookup on java:comp/env/Bean1. And in fact, when a client accesses Bean2 during the initalisation/deployment of the server the lookups on "Bean1" from Bean2 will result in NameNotFoundExceptions.

       

      I tried some variants of the @EJB annotation on Bean2 (mostly trying out different combinations of "beanName"  and "mappedName". I would expect that if I did this correctly the dependence would be notet in the log in either "with dependencies:" or "and demands:".

       

      Then I tried this, which actually worked:

       

      ejb2.jar:

      {code}@Stateless(name="Bean2")

      @EJB(beanInterface=package1.Bean1.class, name="Bean1")

      @Depends( { "jboss.j2ee:ear=my.ear,jar=ejb1.jar,name=Bean1,service=EJB3" })

      public Bean2 {

      ...

      }

      {code}

       

      HOWEVER, it does not work without the EAR name. As the EJB module is reused in different applications this will not work out.

       

      My preliminary solutions is to use a jboss-app.xml with

       

      {code}<jboss-app>

          <module-order>strict</module-order>

      </jboss-app>

      {code}

      and explicit order of the modules in application.xml.

       

      My question is:

       

      Is my workaround with jboss-app.xml the only way to solve this? I would prefer if it would somehow work out just be using the @EJB annotations. Is there any way to get this working?