我是jave ee的新手。我需要以下行为。我有一个注册用户队列。排在最前面的用户可以在 10 分钟内访问页面 A。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 不为空,但 externalContext.requestParameterMap 值为:
目标虚拟机发生异常:
java.lang.NullPointerException:在 com.sun.enterprise.web.pwc.connector.coyote.PwcCoyoteRequest.setRequestEncodingFromSunWebXml( PwcCoyoteRequest.java:188) 在 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) 在 com.sun.faces.context.RequestParameterMap.getEntryIterator (RequestParameterMap.java:126) 在 com.sun.faces.context.BaseContextMap$EntrySet.iterator(BaseContextMap.java:166) 在 com.sun.faces.context.BaseContextMap$BaseSet.size(BaseContextMap.java:154) 在 java.util.Collections$UnmodifiableCollection.size(Collections.java:996) 在 java.util.AbstractMap.size(AbstractMap .java:67) at java.util.Collections$UnmodifiableMap.size(Collections.java:1276) at com.mycompany.hib.ActiveUserTimer.run(ActiveUserTimer.java:29) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method ) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 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。调用(EJBSecurityManager.java:1124)...
我查看了 Quartz,但我想如果我要传递 externalContext 实例,我会遇到确切的问题。有没有其他方法可以实现?