【发布时间】:2013-08-28 22:05:20
【问题描述】:
以下代码来自支持 bean。 async() 由 <f:event listener="#{nextBean.async}" type="preRenderView"/> 从视图中调用。由于我不希望此操作延迟视图的呈现,因此它会触发 EJB 中的 @Asynchronous-annotated 方法返回 Future<Boolean>。
只要此操作正在运行,我就希望 UI 被阻止,因此我执行 <p:remoteCommand> 触发 ready() 来检查 Future-Object 是否有结果,这意味着异步方法已完成,然后解除对 UI 的阻止.
问题:ready() 似乎第二次调用了异步方法。我怎样才能实现我想要做的事情?
支持 bean:
package mypackage;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.java.Log;
@ManagedBean
@ViewScoped
@Getter
@Setter
public class NextBean {
@EJB private AsyncBean asyncBean;
private Future<Boolean> ready;
public void async() {
ready = asyncBean.async();
}
public void ready() {
try {
while (ready.get() != true) {
Thread.sleep(300);
}
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Facelets 代码:
<html xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head></h:head>
<h:body id="wholeView">
<f:metadata>
<f:event listener="#{nextBean.async}" type="preRenderView"></f:event>
</f:metadata>
<p:blockUI id="blockui" block=":wholeView" widgetVar="blockUI">
please wait
</p:blockUI>
<h:form>
<p:remoteCommand onstart="blockUI.show();"
name="doIt"
id="dooo"
process="@this"
action="#{nextBean.ready}"
oncomplete="blockUI.hide();"
autoRun="true"
/>
</h:form>
CONTENT
</h:body>
</html>
EJB:
package mypackage;
import java.util.concurrent.Future;
import javax.ejb.AsyncResult;
import javax.ejb.Asynchronous;
import javax.ejb.Stateless;
import lombok.extern.java.Log;
@Stateless
@Log
public class AsyncBean {
@Asynchronous
public Future<Boolean> async(){
try {
Thread.sleep(3000);
return new AsyncResult<Boolean>(true);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}
更新:
1. 用户被定向到外部页面的视图(作为支付过程的一部分)。
2. 请求视图的业务逻辑应该被执行,它不应该延迟视图的呈现,而是在业务逻辑执行时阻塞它的 UI。
【问题讨论】:
标签: jakarta-ee jsf-2 primefaces