我在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民意调查每隔几秒钟更新一次textArea
问题是msgBuffer仅在ejb方法完成后才更新。调用了log方法,但是对msgBuffer的更改仅在ejb完成后才对Web Bean线程可见。我尝试使msgBuffer易失,并使log和getMsgBuffer方法同步化,但是没有用。
有人有任何解决办法的线索吗?

最佳答案

我不确定,但是我认为@EJB注释不是
您应该将其与@Asynchronous一起使用。

我的猜测是,直到Service调用终止,您的请求才真正完成doProcessing方法。

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

10-08 13:43