我在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 poll来每隔几秒更新一次textArea
问题是msgBuffer
仅在ejb方法完成后更新。调用了log方法,但是msgBuffer
的更改仅在ejb完成后对Web bean线程可见。我尝试使msgBuffer
易变并同步日志和getMsgBuffer
方法,但无法正常工作。
任何人都有任何线索如何解决这个问题?
答案 0 :(得分:0)
我不确定,但我认为@EJB
注释不是
你应该使用的那个加上@Asynchronous
个。
我的猜测是,在服务呼叫终止之前,您的请求实际上并未完成doProcessing
方法。
尝试使用@Inject
,因为它会触发CDI及其所有魔法......