如何实现EJB异步调用的侦听器

时间:2012-10-14 13:32:02

标签: java ejb java-ee-6

我在Jboss 6中部署了一个Web应用程序。我正在使用JDK 6,jSF和P​​rimefaces。

我的业务层中有一个方法需要很长时间才能完成 我希望能够在网页中显示该方法正在执行的操作的日志。这是我尝试的简化版本:

/* 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 poll来每隔几秒更新一次textArea 问题是msgBuffer仅在ejb方法完成后更新。调用了log方法,但是msgBuffer的更改仅在ejb完成后对Web bean线程可见。我尝试使msgBuffer易变并同步日志和getMsgBuffer方法,但无法正常工作。
任何人都有任何线索如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我不确定,但我认为@EJB注释不是 你应该使用的那个加上@Asynchronous个。

我的猜测是,在服务呼叫终止之前,您的请求实际上并未完成doProcessing方法。

尝试使用@Inject,因为它会触发CDI及其所有魔法......