2011-11-03 43 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抱怨,因爲這似乎是你現在唯一的選擇。 –