Wicket Ajax処理 を並列に動作させる


Wicket に AjaxChannel という Class があることを知りました。
Ajax 関連機能 の Optiion 設定値になるのですが、設定した際の動作の変更点が興味深かったので、記載します。


参考

以下、参考にしています。


AjaxChannel 設定値について

以下、3つの Channel 設定があります。

  • queueing
    Ajax リクエストが、クライアント側のキューに保持されます。キューに格納されたデータは、一度に 1 つずつ処理されます。
    デフォルト動作です。

  • drop
    最後の Ajax リクエストのみが処理され、その前のリクエストはすべて破棄されます。

  • active
    実行中の Ajax リクエストがある場合、先勝ちになります。


Ajax を並列で動作させる場合

実行したかったことは、こちらになります。
同一のChannel だと、AjaxChannel の動作で、シリアル実行される ので、Channel 名を変えると、AjaxChannel の設定に寄らず、並列実行される になります。

以下、実装例を記載します。
AjaxRequestAttributes に AjaxChannel を設定する interface があります。

  • AjaxChannel Examples

        // firstLink とは、別のChannelになるので、Blockされない。
        AjaxLink previousLink = new AjaxLink(ID_PREVIOUS_LINK) {
    
            @Override
            protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
                attributes.setChannel(new AjaxChannel("blocking", AjaxChannel.Type.ACTIVE));
            }
    
            @Override
            public void onClick(AjaxRequestTarget target) {
                previousPerformed(target);
            }
        };
        // previousLink とは、別のChannelになるので、Blockされない。
        AjaxLink firstLink = new AjaxLink(ID_FIRST_LINK) {
            @Override
            protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
                attributes.setChannel(new AjaxChannel("queueing", AjaxChannel.Type.QUEUE));
            }
    
            @Override
            public void onClick(AjaxRequestTarget target) {
                firstPerformed(target);
            }
        };
    

  • 使う際の考慮事項
    AjaxChannel は、Channel (キュー) の指定と、Channel の動作の制御ができます。
    使い方のポイントとして以下があるかと思いますので記載します。

    • Chnannel の単位は設計する。
      Ajax コンポーネントは、種類によって、どのChannel を使用するか、Channel の 振る舞いはどうすべきかは設計必要に思いました。

    • 1つのChannel で、協調させる。
      これは試してないので、もしかしたらうまく動かない可能性がありますが、複数のボタンを同じChannel にして、振る舞いを制御することも可能なのかなと思いました。

    • 単純な連打防止
      連打制御という意味だと、DROP 、もしくは、ACTIVE にしておくのがよいかと思いました。
      時間がかかる処理だと、ACTIVE ですぐに完了する処理だと、DROPでしょうか。

以上です。

コメント