0

私は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 インスタンスを渡すと正確な問題が発生したと思います。他に作り方はありますか?

4

1 に答える 1

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>
于 2013-03-01T14:37:19.947 に答える