3

我在 Jboss 6 中部署了一个 Web 应用程序。我正在使用 JDK 6、jSF 和 Primefaces。

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

/* 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 polltextArea每隔几秒钟更新一次。
问题是msgBuffer仅在 ejb 方法完成后才更新。调用 log 方法,但对 的更改msgBuffer仅在 ejb 完成后对 web bean 线程可见。我尝试过制作msgBuffervolatile 并同步日志和getMsgBuffer方法,但没有奏效。
任何人都知道如何解决这个问题?

4

0 回答 0