AS 6.1 EJB dependencies
etano Mar 14, 2012 11:17 AMHi,
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?