SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Javaで軽快に使える「軽量フレームワーク」特集

Javaで軽快に使える「軽量フレームワーク」特集
~小さなライブラリ1つで動くStripes Framework(3)

第19回

ロングイベントの利用

 サーバ側で長い時間かかる処理を行うような場合、Webではサーバにアクセスに行ったまま、しばらくブラウザが固まってしまいます。数秒程度ならば待ってくれるでしょうが、これが数十秒にもなると、ほとんどの人は「何かおかしくなった」とリロードするか、他のページに移動するなどしてしまうでしょう。

 Stripesのプラグイン・ライブラリには、こうしたサーバでの長い時間がかかる処理への対応をするための「ロングイベント」と呼ばれる機能が用意されています。これを利用することで、長時間かかるサーバ処理でもインタラクティブにユーザーに対応できるようになります。

 ロングイベントを利用するには、まずweb.xmlに必要な設定を追加します。<filter>と、<web-app>の2か所に次のように追記をしておきましょう。

<filter>内に追加
<init-param>
  <param-name>CoreInterceptor.Classes</param-name>
  <param-value>
    org.stripesstuff.plugin.waitpage.WaitPageInterceptor,
    net.sourceforge.stripes.controller.BeforeAfterMethodInterceptor,
    net.sourceforge.stripes.controller.HttpCacheInterceptor
  </param-value>
</init-param>
<web-app>内に追加
<servlet-mapping>
    <servlet-name>StripesDispatcher</servlet-name>
    <url-pattern>*.wait</url-pattern>
</servlet-mapping>

 ロングイベントでは、CoreInterceptorというクラスにいくつかのクラス類をロードしておく必要があります。また、処理待ちの間に表示させるページへのアクションに「*.wait」というアドレスが用いられるため、これをサーブレットマッピングに追加しておく必要があります。

ActionBeanの修正

 続いて、ActionBeanクラスを用意します。HeloActionBeanを次のように書き換えて利用することにしましょう。

package jp.codezine;

import java.util.*;
import net.sourceforge.stripes.action.*;
import org.stripesstuff.plugin.session.Session;
import org.stripesstuff.plugin.waitpage.WaitPage;

public class HeloActionBean implements ActionBean {
  private ActionBeanContext context;
  private int counter = 0;

  public int getCounter() { return counter; }
  public void setCounter(int counter) { this.counter = counter; }

  @Override
  public ActionBeanContext getContext() {
    return this.context;
  }

  @Override
  public void setContext(ActionBeanContext context) {
    this.context = context;
  }

  @HandlesEvent("longEvent")
  @WaitPage(path = "/wait.jsp", refresh = 1000)
  public Resolution longEvent(){
    try {
      for (int i = 1; i <= 10; i++) {
        Thread.sleep(1000);
        counter++;
      }
    } catch (InterruptedException e) {}
    return new RedirectResolution("/helo.jsp");
  }
}

 ここでは、counterというint型のプロパティを用意しておきました。longEventというメソッドが、ロングイベント用の処理を行っている部分です。これも、一般的なイベント処理用のハンドラと同じような形で作成をします。ただし、メソッドの前に「@WaitPage」というアノテーションがつけられている点だけが異なります。これは、待ち状態の間に表示されるページを指定するためのものです。これを用意することで、メソッドで処理を行っている間、指定のページが表示されるようになります。次のように記述します。

@WaitPage(path = アドレス, refresh = ミリ秒数 )

 pathには、表示されるページのアドレスを指定します。またrefreshには、表示更新の間隔をミリ秒単位で指定します。これは、Webページのリロード間隔ではなく、待ち状態の表示ページからサーバに問い合わせがされたとき、サーバの状態(プロパティの値など)を更新する間隔を示します。

 ここでは、Thread.sleepで1秒ごとにcounterを増やしています。見れば分かるように、特に別スレッドなどを用意しているわけでもありません。そして繰り返しを抜けたら、RedirectResolutionで再びhelo.jspに戻っています。このRedirectResolutionはリダイレクトを行うためのResolutionで、ForwardResolutionと併せて覚えておくとよいでしょう。

次のページ
JSPページの作成

この記事は参考になりましたか?

Javaで軽快に使える「軽量フレームワーク」特集連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5261 2010/07/16 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー