私は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: com.sun.enterprise.web.pwc.connector.coyote.PwcCoyoteRequest.getFormHintFieldEncoding(PwcCoyoteRequest.java:225) で 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) で java.util.Collections$UnmodifiableMap.size(Collections.java:1276) で com.mycompany.hib.ActiveUserTimer.run(ActiveUserTimer.java:29) で 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 org.glassfish.ejb.security.application.EJBSecurityManager の .glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)。呼び出し (EJBSecurityManager.java:1124) ...
Quartz を見ましたが、externalContext インスタンスを渡すと正確な問題が発生したと思います。他に作り方はありますか?