Jakarta ee @异步不导致JBossAS7中EJB方法的异步调用

Jakarta ee @异步不导致JBossAS7中EJB方法的异步调用,jakarta-ee,ejb,java-ee-6,ejb-3.1,jboss7.x,Jakarta Ee,Ejb,Java Ee 6,Ejb 3.1,Jboss7.x,我正在努力弄清楚为什么EJB中的@Asynchronous方法实际上没有被异步调用。我在JSF2项目中使用CDI(带beans.xml)在JBossAS7上运行,该项目使用Maven生产的simple.war包 EJB和与之交互的JSF2托管bean打包在.war中。这是一个简单的@Stateless EJB。它是通过将它(通过@Inject)注入调用其@Asynchronous方法的JSF2托管bean来使用的 它不是立即返回未来的@Asynchronous方法调用,而是同步执行,就像它是一个

我正在努力弄清楚为什么EJB中的@Asynchronous方法实际上没有被异步调用。我在JSF2项目中使用CDI(带beans.xml)在JBossAS7上运行,该项目使用Maven生产的simple.war包

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

它不是立即返回未来的@Asynchronous方法调用,而是同步执行,就像它是一个普通的未经验证的直接调用一样。无论我使用本地无接口视图还是本地业务接口来调用EJB,这都是正确的

是否仅对@Remote Bean支持@Asynchronous?如果是这样,它能在.war打包中工作吗?或者我必须在EAR中打包一个EJBJAR才能获得这一特性吗

例如,为了简化代码,每个类都在.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();
  }

}
公共接口{
公共未来剂量();
}
@无国籍
@本地(SomeEJB.class)
公共类somejbimpl实现了SomeEJB{
@异步的
@凌驾
公共未来剂量表(){
//花一段时间做工作
//然后:
返回新的异步结果(空);
}
}
@命名
@请求范围
公共类JSFBean{
@注入私有瞬态SomeEJB SomeEJB;
私营部门未来的进展;
//从JSF2调用,开始工作并重新显示页面
公共字符串startWorkAction(){
//此调用应立即返回Future。相反,它会阻止
//直到doWork()完成。
progress=someEJB.doWork();
}
公共布尔isDone(){
返回进度!=null&&progress.isDone();
}
}

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

是的,这对用户很友好

要在这个假定已完成并发布的*产品中启用这些功能,您必须使用“standalone preview.xml”运行JBoss AS 7.0.2,例如:

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

bin/standalone.sh --server-config=standalone-full.xml
。。。它获取要调用的异步方法。。。异步的

  • (无可否认,7并不声称JavaEE6完全符合概要文件要求,但最好给出一个警告!或者提供一些关于已知问题/漏洞的文档!除了无声的未记录故障以外的任何内容…)

更新:正如garcia jj所指出的,从
standalone.xml
中删除
lite=true
也会使异步EJB工作。

现在看来@Asynchronous在JBoss As 7中没有实现(从7.0.2开始)-再次表明,在规范发布几年后,JavaEE6实现仍然存在缺陷和不完整。唉。最好发出警告或其他非静默失败的功能。您可以使用AS 7.0.2中的独立预览配置启用一些默认关闭的EJB3.1功能。调用为:“bin/standalone.sh--server config=standalone preview.xml”注意,在as 7.1中,“standalone preview.xml”现在是“standalone full.xml”,如何在不使用standalone preview的情况下启用异步EJB?谢谢。@garcia jj在JBoss AS 7的较新版本中,它现在被称为standalone-full.xml,但要点是相同的:如果要使用异步EJB,必须使用支持异步EJB的配置文件运行服务器。如果你不喜欢,向JBoss投诉,因为这似乎是你现在唯一的选择。我找到了其他解决方案:在standalone.xml中从urn:JBoss:domain:ejb3:1.1中删除属性lite=true。@garcia jj这与使用
standalone full.xml
有什么不同?知道standalone-full.xml中哪些功能是活动的,而lite=false没有激活这些功能吗?
bin/standalone.sh --server-config=standalone-full.xml