7

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

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

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

@Asynchronous 是否仅支持 @Remote bean?如果是这样,它可以在 .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();
  }

}
4

1 回答 1

9

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

是的,这是用户友好的。

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

bin/standalone.sh --server-config=standalone-preview.xml

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

bin/standalone.sh --server-config=standalone-full.xml

...它获取要调用的异步方法...异步。

  • (诚​​然,AS 7 并没有声称 Java EE 6 Full Profile 合规性,但警告会很好!或者一些关于已知问题/漏洞的文档!除了无声的无证失败之外的任何东西......)

更新:正如 garcia-jj 所指出的,删除lite=truefromstandalone.xml也将使异步 EJB 工作。

于 2011-11-03T06:10:20.077 回答