ロングイベントの利用
サーバ側で長い時間かかる処理を行うような場合、Webではサーバにアクセスに行ったまま、しばらくブラウザが固まってしまいます。数秒程度ならば待ってくれるでしょうが、これが数十秒にもなると、ほとんどの人は「何かおかしくなった」とリロードするか、他のページに移動するなどしてしまうでしょう。
Stripesのプラグイン・ライブラリには、こうしたサーバでの長い時間がかかる処理への対応をするための「ロングイベント」と呼ばれる機能が用意されています。これを利用することで、長時間かかるサーバ処理でもインタラクティブにユーザーに対応できるようになります。
ロングイベントを利用するには、まずweb.xmlに必要な設定を追加します。<filter>と、<web-app>の2か所に次のように追記をしておきましょう。
<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>
<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と併せて覚えておくとよいでしょう。
