Jboss 6 に Web アプリケーションをデプロイしています。JDK 6、jSF、および Primefaces を使用しています。
ビジネス層に完了までに長い時間がかかるメソッドがあります。
メソッドが何をしているかのログを Web ページに表示できるようにしたいと考えています。これは、私がしようとしているものの簡略化されたバージョンです:
/* 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
ます。textArea
数秒ごとに更新するために、primefaces poll を使用します。
問題はmsgBuffer
、ejb メソッドが終了した後にのみ更新されることです。log メソッドが呼び出されますが、への変更msgBuffer
は ejb が終了した後にのみ Web Bean スレッドに表示されます。msgBuffer
volatile にして、ログとメソッドを同期しようとしgetMsgBuffer
ましたが、うまくいきませんでした。
誰でもこれを解決する方法を知っていますか?