2011-11-03 44 views
7

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

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

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

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

} 
+0

它开始看起来像@Asynchronous没有在JBoss AS 7中实现(从7.0.2开始) - 再一次地,标志Java EE 6的实现在规范发布后仍然是bug和不完整的几年。叹。如果发出警告或某些不是SILENTLY FAIL,那将会很好。 –

+0

您可以使用AS 7.0.2中的独立预览配置启用某些默认的EJB3.1功能。调用为:“bin/standalone.sh --server-config = standalone-preview.xml” –

回答

9

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

是的,这是用户友好的。

要启用这些功能在这个理应完成并发布*产品,你必须运行的JBoss AS 7.0.2与 “独立-preview.xml”,例如:

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

或7.1(测试版)或更高版本:

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

...它异步调用异步方法。

  • (诚然AS 7不要求Java EE 6的全部档案达标,但警告将是很好!还是在已知问题/孔!只要不是沉默无证失败一些文件...)

更新:如garcia-jj所述,从standalone.xml删除lite=true也将使异步EJB工作。

+0

请注意,在AS 7.1中,“standalone-preview.xml”现在是“standalone-full.xml” –

+0

如何启用异步EJB使用独立预览?谢谢。 –

+0

@ garcia-jj在较新版本的JBoss AS 7中,它现在被称为standalone-full.xml,但重点是相同的:如果要使用异步EJB,则必须使用支持异步EJB的配置文件运行服务器。如果你不喜欢它,向JBoss抱怨,因为这似乎是你现在唯一的选择。 –