2012-10-14 48 views
3

我有一個Web應用程序部署在Jboss 6中。我使用的是JDK 6,jSF和P​​rimefaces。如何實現偵聽器到EJB異步調用

我在業務層有一個方法需要很長時間才能完成。
我希望能夠在網頁上顯示該方法正在做什麼的日誌。這裏是什麼即時通訊試圖簡化版本:

/* interface to log processing */ 

interface StatusListener { 
    void log(String msg); 
} 

/* Business class */ 

@Stateless  
class Service { 

    @Asynchronous 
    public void doProcessing(StatusListener listener) { 

     for (int i = 0; i < 1000000; i++) { 
      processItem(i); 
      listener.log("processando item " + n); 
     } 
    } 
} 

/* JSF backing bean class */ 

@Named 
public class WebBean implements StatusListener { 

    private @EJB Service service; 
    private StringBuffer msgBuffer; 

    public void doProcessing() { 
     service.doProcessing(this); 
    } 

    @Override 
    public void log(String msg) { 
     msgBuffer.append(msg + "\n"); 
    } 

    public StringBuffer getMsgBuffer() { 
     return msgBuffer; 
    } 

} 

在我的XHTML我有一個textArea,其價值指向msgBuffer。我使用primefaces輪詢來每隔幾秒更新textArea
問題是msgBuffer只在ejb方法結束後才更新。日誌方法被調用,但對msgBuffer的更改僅在ejb完成後纔可見到Web Bean線程。我試圖使msgBuffer易失性和同步的日誌和getMsgBuffer方法,但沒有奏效。
任何人都有任何線索如何解決這個問題?

回答

0

我不確定,但我認爲@EJB註釋不是 您應該使用一個與@Asynchronous之一。

我的猜測是,您的請求實際上沒有完成doProcessing方法,直到服務調用終止。

嘗試使用@Inject,因爲它觸發了CDI及其所有的魔力......