ejb archive jar 中的循环依赖无状态 bean 未在 JBoss 5.1.0 上部署

Cyclically dependent Stateless beans in ejb archive jar not getting deployed on JBoss 5.1.0

我创建了一个 EJB 项目,其中包含以下 java 个文件。 它不会在 JBoss 5.1.0 上部署并吐出附加在下面 java 代码之后的部署错误。但是同一个 jar 被部署在 JBoss AS 7.1 上。 为什么 jar 没有在 JBoss 5.1 上部署?

请注意,bean实现BeanA有-a BeanB的本地接口和BeanB的bean实现有-a BeanA的本地接口所以这是一个循环。

BeanALocalInterface.java

package com.xyz;    
import javax.ejb.Local;    
    @Local    
public interface BeanALocalInterface {
    public void executeLocal();
}

BeanA.java

package com.xyz;
import javax.ejb.EJB;
import javax.ejb.Stateless;
@Stateless
public class BeanA implements  BeanALocalInterface {
    @EJB    private BeanBLocalInterface beanBLocalInterface;
    public BeanA() {}
    public void executeLocal() {System.out.println("executing in  BeanA"); beanBLocalInterface.executeLocal();}
    public void executeRemote() {System.out.println("executing in  BeanA"); }
}

BeanBLocalInterface.java

package com.xyz;
import javax.ejb.Local;
@Local
public interface BeanBLocalInterface {
    public void executeLocal();
}

BeanB.java

package com.xyz;
import javax.ejb.EJB;
import javax.ejb.Stateless;
@Stateless
public class BeanB  implements BeanBLocalInterface  {
    @EJB private BeanALocalInterface localInterface;
    public BeanB() {  }
    public void executeLocal() { localInterface.executeLocal(); }
    public void executeRemote() { System.out.println("executing in  BeanB");}
}

在 JBOSS 5.1.0

中部署 CyclicalBeans.jar 时的错误日志
11:59:31,557 INFO  [JBossASKernel] Created KernelDeployment for: CyclicalBeans.jar
11:59:31,557 INFO  [JBossASKernel] installing bean: jboss.j2ee:jar=CyclicalBeans.jar,name=BeanA,service=EJB3
11:59:31,557 INFO  [JBossASKernel]   with dependencies:
11:59:31,557 INFO  [JBossASKernel]   and demands:
11:59:31,573 INFO  [JBossASKernel]      jndi:BeanB/local-com.xyz.BeanBLocalInterface
11:59:31,573 INFO  [JBossASKernel]      jboss.ejb:service=EJBTimerService
11:59:31,573 INFO  [JBossASKernel]   and supplies:
11:59:31,573 INFO  [JBossASKernel]      jndi:BeanA/local-com.xyz.BeanALocalInterface
11:59:31,588 INFO  [JBossASKernel]      jndi:BeanA/local
11:59:31,588 INFO  [JBossASKernel]      Class:com.xyz.BeanARemoteInterface
11:59:31,588 INFO  [JBossASKernel]      jndi:BeanA/remote-com.xyz.BeanARemoteInterface
11:59:31,588 INFO  [JBossASKernel]      Class:com.xyz.BeanALocalInterface
11:59:31,604 INFO  [JBossASKernel]      jndi:BeanA/remote
11:59:31,604 INFO  [JBossASKernel] Added bean(jboss.j2ee:jar=CyclicalBeans.jar,name=BeanA,service=EJB3) to KernelDeployment of: CyclicalBeans.jar
11:59:31,604 INFO  [JBossASKernel] installing bean: jboss.j2ee:jar=CyclicalBeans.jar,name=BeanB,service=EJB3
11:59:31,619 INFO  [JBossASKernel]   with dependencies:
11:59:31,619 INFO  [JBossASKernel]   and demands:
11:59:31,619 INFO  [JBossASKernel]      jboss.ejb:service=EJBTimerService
11:59:31,635 INFO  [JBossASKernel]      jndi:BeanA/local-com.xyz.BeanALocalInterface
11:59:31,635 INFO  [JBossASKernel]   and supplies:
11:59:31,635 INFO  [JBossASKernel]      Class:com.xyz.BeanBLocalInterface
11:59:31,635 INFO  [JBossASKernel]      jndi:BeanB/local-com.xyz.BeanBLocalInterface
11:59:31,651 INFO  [JBossASKernel]      jndi:BeanB/local
11:59:31,651 INFO  [JBossASKernel]      jndi:BeanB/remote
11:59:31,666 INFO  [JBossASKernel] Added bean(jboss.j2ee:jar=CyclicalBeans.jar,name=BeanB,service=EJB3) to KernelDeployment of: CyclicalBeans.jar
11:59:31,666 INFO  [EJB3EndpointDeployer] Deploy AbstractBeanMetaData@68f7b23c{name=jboss.j2ee:jar=CyclicalBeans.jar,name=BeanA,service=EJB3_endpoint bean=org.jboss.ejb3.endpoint.deployers.impl.EndpointImpl properties=[container] constructor=null autowireCandidate=true}
11:59:31,666 INFO  [EJB3EndpointDeployer] Deploy AbstractBeanMetaData@3b870737{name=jboss.j2ee:jar=CyclicalBeans.jar,name=BeanB,service=EJB3_endpoint bean=org.jboss.ejb3.endpoint.deployers.impl.EndpointImpl properties=[container] constructor=null autowireCandidate=true}
11:59:31,744 WARN  [HDScanner] Failed to process changes
org.jboss.deployers.client.spi.IncompleteDeploymentException: Summary of incomplete deployments (SEE PREVIOUS ERRORS FOR DETAILS):

DEPLOYMENTS MISSING DEPENDENCIES:
  Deployment "jboss.j2ee:jar=CyclicalBeans.jar,name=BeanA,service=EJB3" is missing the following dependencies:
    Dependency "<UNKNOWN jboss.j2ee:jar=CyclicalBeans.jar,name=BeanA,service=EJB3>" (should be in state "Described", but is actually in state "** UNRESOLVED Demands 'jndi:BeanB/local-com.xyz.BeanBLocalInterface' **")
  Deployment "jboss.j2ee:jar=CyclicalBeans.jar,name=BeanA,service=EJB3_endpoint" is missing the following dependencies:
    Dependency "jboss.j2ee:jar=CyclicalBeans.jar,name=BeanA,service=EJB3" (should be in state "Configured", but is actually in state "PreInstall")
  Deployment "jboss.j2ee:jar=CyclicalBeans.jar,name=BeanB,service=EJB3" is missing the following dependencies:
    Dependency "<UNKNOWN jboss.j2ee:jar=CyclicalBeans.jar,name=BeanB,service=EJB3>" (should be in state "Described", but is actually in state "** UNRESOLVED Demands 'jndi:BeanA/local-com.xyz.BeanALocalInterface' **")
  Deployment "jboss.j2ee:jar=CyclicalBeans.jar,name=BeanB,service=EJB3_endpoint" is missing the following dependencies:
    Dependency "jboss.j2ee:jar=CyclicalBeans.jar,name=BeanB,service=EJB3" (should be in state "Configured", but is actually in state "PreInstall")

DEPLOYMENTS IN ERROR:
  Deployment "<UNKNOWN jboss.j2ee:jar=CyclicalBeans.jar,name=BeanA,service=EJB3>" is in error due to the following reason(s): ** UNRESOLVED Demands 'jndi:BeanB/local-com.xyz.BeanBLocalInterface' **
  Deployment "<UNKNOWN jboss.j2ee:jar=CyclicalBeans.jar,name=BeanB,service=EJB3>" is in error due to the following reason(s): ** UNRESOLVED Demands 'jndi:BeanA/local-com.xyz.BeanALocalInterface' **

        at org.jboss.deployers.plugins.deployers.DeployersImpl.checkComplete(DeployersImpl.java:993)
        at org.jboss.deployers.plugins.deployers.DeployersImpl.checkComplete(DeployersImpl.java:939)
        at org.jboss.deployers.plugins.main.MainDeployerImpl.checkComplete(MainDeployerImpl.java:873)
        at org.jboss.system.server.profileservice.repository.MainDeployerAdapter.checkComplete(MainDeployerAdapter.java:128)
        at org.jboss.system.server.profileservice.hotdeploy.HDScanner.scan(HDScanner.java:369)
        at org.jboss.system.server.profileservice.hotdeploy.HDScanner.run(HDScanner.java:255)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
        at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access1(ScheduledThreadPoolExecutor.java:98)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:180)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:204)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
        at java.lang.Thread.run(Thread.java:662)

注入 Bean 上的@IgnoreDependency 注释将解决此问题。请修改BeanA.java和BeanB.java如下:

BeanA.java

package com.xyz;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import org.jboss.ejb3.annotation.IgnoreDependency;
@Stateless
public class BeanA implements  BeanALocalInterface {
    @IgnoreDependency
    @EJB(name="ejb/BeanBLocalInterface")    private BeanBLocalInterface beanBLocalInterface;
    public BeanA() {}
    public void executeLocal() {System.out.println("executing in  BeanA"); beanBLocalInterface.executeLocal();}
    public void executeRemote() {System.out.println("executing in  BeanA"); }
}

BeanB.java

package com.xyz;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import org.jboss.ejb3.annotation.IgnoreDependency;

@Stateless
public class BeanB  implements BeanBLocalInterface  {
    @IgnoreDependency
    @EJB(name="ejb/BeanALocalInterface ") private BeanALocalInterface localInterface;
    public BeanB() {  }
    public void executeLocal() { localInterface.executeLocal(); }
    public void executeRemote() { System.out.println("executing in  BeanB");}
}

我从以下问题的答案中得出我的解决方案 link。 answer link