下面的代码来自一个支持 bean。async()
从视图中被 调用<f:event listener="#{nextBean.async}" type="preRenderView"/>
。由于我不希望此操作延迟视图的呈现,因此它会触发@Asynchronous
EJB 中的 -annotated 方法返回Future<Boolean>
.
只要此操作正在运行,我就希望 UI 被阻止,因此我执行一个<p:remoteCommand>
触发ready()
检查是否有Future
-Object 的结果,这意味着异步方法已完成,然后解除对 UI 的阻止。
问题:异步方法似乎被ready()
. 我怎样才能实现我想要做的事情?
后备豆:
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。