我在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民意调查每隔几秒钟更新一次textArea
。问题是
msgBuffer
仅在ejb方法完成后才更新。调用了log方法,但是对msgBuffer
的更改仅在ejb完成后才对Web Bean线程可见。我尝试使msgBuffer
易失,并使log和getMsgBuffer
方法同步化,但是没有用。有人有任何解决办法的线索吗?
最佳答案
我不确定,但是我认为@EJB
注释不是
您应该将其与@Asynchronous
一起使用。
我的猜测是,直到Service调用终止,您的请求才真正完成doProcessing
方法。
尝试使用@Inject
,因为它会触发CDI及其所有魔术。