我在 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 线程可见。我尝试过制作msgBuffer
volatile 并同步日志和getMsgBuffer
方法,但没有奏效。
任何人都知道如何解决这个问题?