@Asynchronous不会导致JBossAS7中EJB方法的异步调用

Cra*_*ger 7 ejb java-ee java-ee-6 ejb-3.1 jboss7.x

我正在努力弄清楚为什么我的EJB中的@Asynchronous方法实际上并没有异步调用.我正在使用CDI(带有beans.xml)在JBoss AS 7上运行JSF2项目,并使用Maven生成的简单.war包装.

EJB与.war一起打包,以及与之交互的JSF2托管bean.这是一个简单的@Stateless EJB.通过将它(通过@Inject)注入到调用其@Asynchronous方法的JSF2托管bean中来使用它.

而不是立即返回Future的@Asynchronous方法调用,它同步执行,就好像它是一个普通的未经代理的直接调用.无论我使用本地无接口视图还是本地业务接口来调用EJB,都是如此.

@Remote bean只支持@Asynchronous吗?如果是这样,它可以在.war包装中工作,还是我必须在EAR中打包EJB jar才能获得这个功能?

例如简化代码,每个类在.war中的同一个包中:

public interface SomeEJB {
  public Future<Void> doSomething();
}

@Stateless
@Local(SomeEJB.class)
public class SomeEJBImpl implements SomeEJB {

  @Asynchronous
  @Override
  public Future<Void> doSomething() {
    // Spend a while doing work
    // then:
    return new AsyncResult<Void>(null);
  }

}

@Named
@RequestScoped
public class JSFBean {

  @Inject private transient SomeEJB someEJB;
  private Future<Void> progress;

  // Called from JSF2, starts work and re-displays page
  public String startWorkAction() {
    // This call SHOULD return a Future immediately. Instead it blocks
    // until doWork() completes.
    progress = someEJB.doWork();
  }

  public Boolean isDone() {
    return progress != null && progress.isDone();
  }

}
Run Code Online (Sandbox Code Playgroud)

Cra*_*ger 9

JBoss AS 7.0.2默认不支持@Asynchronous.你必须打开它.如果它没有打开,则没有警告或错误消息,异步方法只是同步执行.

是的,那是用户友好的.

要在这个所谓的已完成和已发布的*产品中启用这些功能,您必须使用"standalone-preview.xml"运行JBoss AS 7.0.2,例如:

bin/standalone.sh --server-config=standalone-preview.xml
Run Code Online (Sandbox Code Playgroud)

或在AS 7.1(测试版)或更高版本中:

bin/standalone.sh --server-config=standalone-full.xml
Run Code Online (Sandbox Code Playgroud)

...它以异步方式调用异步方法.

  • (不可否认,AS 7并未声明Java EE 6完整配置文件合规性,但警告会很好!或者有关已知问题/漏洞的一些文档!除了无声的无证失败之外的任何事情......)

更新:由于加西亚-JJ,移除lite=truestandalone.xml也将获得异步EJB的工作.