我是java.util.concurrent
包的新手,我遇到了Future
對象的問題。Java EE Future NullPointer
這是一個conversationScoped bean。
@Inject SomeBean stateFull;
Boolean comp = false, comp1 = false;
public void doSomething(){
stateFull.runProcess();
try {
comp = stateFull.getFuture().get();
System.out.println("Future "+syncEJB.getFuture().get());
updateView();
comp1 = stateFull.getFuture1().get();
System.out.println("Future "+syncEJB.getFuture().get());
updateView();
} catch (InterruptedException ex) {
Logger.getLogger(SynchronizationMB.class.getName()).log(Level.SEVERE, null, ex);
} catch (ExecutionException ex) {
Logger.getLogger(SynchronizationMB.class.getName()).log(Level.SEVERE, null, ex);
}
}
SomeBean看起來像這樣。
@Stateful
public class SomeBean{
@Inject AnotherBean stateLess;
private volatile Future<Boolean> future, future1;
@Asynchronous
public void runProcess(){
future = stateLess.compute();
future1 = stateLess.compute();
}
public Future<Boolean> getFuture() {
return future;
}
public Future<Boolean> getFuture1() {
return future1;
}
}
而且AnotherBean:
@Stateless
public class AnotherBean{
@Asynchronous
public Future<Boolean> compute() {
boolean result;
System.out.println("--------------");
System.out.println("completed sync");
System.out.println("--------------");
result = true;
return new AsyncResult<Boolean>(result);
}
}
而現在我的問題。我打電話doSomething()
方法,我認爲根據Future.get()
文檔應該調用runProcess()
和比
comp = stateFull.getFuture().get();
等到未來SomeBean從AnotherBean完成,但它只是不停地扔NullPointerException
。任何人都知道它爲什麼會發生?
-------------------編輯-----------------------
NullPointer已更正。現在我有另一個問題。假設我通過調用runProcess()中的更多方法在Somebean中設置更多Future對象。然後,我希望每當Future對象獲得結果以查看進度時更新我的頁面。我怎麼做?現在我使用
private void updateView(){
RequestContext ctx = RequestContext.getCurrentInstance();
ctx.update("mainFrm:info");
}
在doSomething()方法中的每一個布爾值下,但它沒有做我想做的事。所有的布爾一次只出現一次。
你爲什麼不簡單定義:'public Future runProcess(){return stateLess.compute(); },這個額外變量的目的是什麼? –
2012-08-17 11:38:14
因爲我將在runProcess()中調用更多類似的方法,目前只有一個用於測試目的,與conversationScoped bean中的布爾值相同,將會有更多 – 2012-08-17 11:44:45
首先查找哪個值爲null,查看堆棧跟蹤:is在stateFull.runProcess()或stateFull.getFuture()。get()? – 2012-08-17 11:49:45