我是jave ee的新手。我需要以下行为。我有一个注册用户队列。队列头上的用户可以访问页面A 10分钟。 10分钟后,他应该被重定向到另一个页面B并从队列中删除。如果该用户登出/关闭浏览器,他也应该从队列中删除。
如果用户停留在页面A 10分钟,我无法重定向到页面B.
我正在尝试使异步计时器重定向到B:
在页面A:
<h:body>
#{CheckBean.runTimer()}
...
这是CheckBean:
public class CheckBean {
@EJB
ActiveUserTimer timer;
...
public void runTimer() {
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext externalContext = context.getExternalContext();
timer.run(externalContext, System.currentTimeMillis());
...
EJB计时器:
@Stateless
public class ActiveUserTimer{
@Asynchronous
public void run (ExternalContext externalContext, long time) {
while (true) {
if (System.currentTimeMillis() - time > 10000 || someFuncDetectedUserIsOffline()) {
externalContext.redirect("../public/index.xhtml");
Thread.sleep(1000);
}
}
}
问题是当我将externalContext传递给run()方法时,externalContext不为null,但externalContext.requestParameterMap值为:
目标VM发生异常:
显示java.lang.NullPointerException: at com.sun.enterprise.web.pwc.connector.coyote.PwcCoyoteRequest.getFormHintFieldEncoding(PwcCoyoteRequest.java:225) at com.sun.enterprise.web.pwc.connector.coyote.PwcCoyoteRequest.setRequestEncodingFromSunWebXml(PwcCoyoteRequest.java:188) at com.sun.enterprise.web.pwc.connector.coyote.PwcCoyoteRequest.getCharacterEncoding(PwcCoyoteRequest.java:129) 在org.apache.catalina.connector.Request.parseRequestParameters(Request.java:3114) 在org.apache.catalina.connector.Request.getParameterNames(Request.java:1282) 在org.apache.catalina.connector.RequestFacade.getParameterNames(RequestFacade.java:438) at com.sun.faces.context.RequestParameterMap.getEntryIterator(RequestParameterMap.java:126) at com.sun.faces.context.BaseContextMap $ EntrySet.iterator(BaseContextMap.java:166) at com.sun.faces.context.BaseContextMap $ BaseSet.size(BaseContextMap.java:154) at java.util.Collections $ UnmodifiableCollection.size(Collections.java:996) 在java.util.AbstractMap.size(AbstractMap.java:67) at java.util.Collections $ UnmodifiableMap.size(Collections.java:1276) 在com.mycompany.hib.ActiveUserTimer.run(ActiveUserTimer.java:29) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在java.lang.reflect.Method.invoke(Method.java:597) 在org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052) 在org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124) ...
我查看了Quartz,但是如果我传递externalContext实例,我想我已经遇到了确切的问题。 还有其他方法可以做到吗?
答案 0 :(得分:2)
此任务根本不需要任何服务器计时器。您可以使用纯JavaScript来完成。检查setTimeout
功能以解决您的问题。
知道这一点,你可以做类似于
的事情<script type="text/javascript">
setTimeout(function() {
document.getElementById('myForm:btnContinue').submit();
}, 10*1000*60);
</script>
<h:form id="myForm">
<!-- page content... -->
<h:commandButton id="btnContinue" value="Continue" action="#{bean.continue}" />
</h:form>