Javaサンプルコード辞典

DWRでリッチなWebページを作る!(9) - リモートオブジェクトの呼び出しにタイムアウトを設定する

クライアントからリモートオブジェクトを呼び出した際、ネットワーク障害やサーバー自体がダウンしていることによりサーバーからレスポンスが返されない事態が想定されます。DWRのリモートコールは非同期呼び出しなので、クライアントのブラウザがとまってしまうことは無いのですが、反応が無いためユーザからすると何が起こっているのか分からない状況になってしまいます。そこで、今回はリモートオブジェクトの呼び出しの際にタイムアウト時間を設定し、タイムアウトが発生した場合になんらかの処理を行う方法を紹介します。

今回のサーバー側のオブジェクトは『(2)Webページからサーバのオブジェクトを呼び出す』で紹介した「Hello.java」を使用します。(といってもタイムアウトさせるサンプルなので実際は何でもかまいません。)それではクライアント側のHTMLのコードをみていきます。

<script type="text/javascript"><!--

dwr.engine.setTimeout(1000);

function hello() {
  var name = dwr.util.getValue("username");
  Hello.hello(name, function(data) {  
        dwr.util.setValue("reply", data);
  });
}

// --></script>

タイムアウトの設定はdwr.engine.setTimeout(1000)の一行を追加するだけです。引数はミリ秒単位での指定になります。この方法で指定した場合、ページの全ての関数に対して適用されます。また、以下のように記述することで個別の関数に対してタイムアウトを設定することも可能です。

<script type="text/javascript"><!--

function hello() {
  var name = dwr.util.getValue("username");
  Hello.hello(name, {
              callback:function(data) {
                    dwr.util.setValue("reply", data);
              },
              timeout:1000

        }
  );
}

// --></script>

リモートオブジェクトのメソッド(ここではHello.hello)の最後の引数には、コールバック関数を直接指定する他に連想配列の形式で複数のオプションを設定することが可能です。上記のサンプルでは、そのうちの「timeout」オプションを使用してタイムアウトの時間を設定しています。上記2つの方法でタイムアウトを設定した場合は、以下の画面のようにダイアログに「Timeout」と表示されます。これはデフォルトのエラーハンドラの処理によるものです。

これではちょっと素っ気無いので独自のエラーハンドラを用意します。

「ページの関数に共通で設定する場合」

dwr.engine.setErrorHandler(function(){
            alert('タイムアウトが発生しました!');
      });

「個別に関数に設定する場合」
function hello() {
  var name = dwr.util.getValue("username");
  Hello.hello(name, {
              callback:function(data) {  
                    dwr.util.setValue("reply", data);
              },
              errorHandler:function()
              {
                    alert('タイムアウトが発生しました!');
              },

              timeout:1000
        });
}

上記のようにエラーハンドラに自作の処理関数を指定することで、タイムアウト発生時の処理をカスタマイズすることができます。しかし、エラーハンドラはタイムアウト以外に、例えばHTTPのリターンコードが200以外であった場合や、リモートオブジェクトが例外を投げた場合などにもコールされます。ですので上記のサンプルのように、タイムアウトのみを想定していると少しまずい時もあります。以下はそういった場合に対処したサンプルです。

dwr.engine.setErrorHandler(function(msg,err){
            //タイムアウト以外のエラーの場合
            if(err.name != 'dwr.engine.timeout')
            {
                  alert(msg);
            }
            else
            {
                  alert('タイムアウトが発生しました!');
            }
      });

エラーハンドラの第1引数には、エラーメッセージ(タイムアウトの場合、「Timeout」が渡されます)、第2引数には、連想配列としてメッセージとエラーの種類を識別するためのnameが渡されます。上記のサンプルでは、そのnameを使用してタイムアウトとそれ以外のエラーを判別しています。タイムアウト発生時には、nameに「dwr.engine.timeout」が入っています。

今回紹介しましたタイムアウト設定によりユーザが長時間待たされることを回避することができます。本稿のサンプルはIEとFirefoxで動作を確認しましたが、timeout時間に1000ミリ以上を指定すると、エラーハンドラがコールされない場合があります。(何回かクリックするとコールされます。)
さて、次回はリモートオブジェクトで例外が発生した場合のサンプルを紹介します。


(2007年12月9日)  

 ちょっと一休み. Javaキーワード並び替えゲーム

画面に表示される文字列を並び替えるとJavaに関連するキーワードになります。ヒントをたよりに並び替えを行ってエンターを押してください。 ユーザ登録をしてログインするとランキングに参加できます。
Flex Tips

DWRでリッチなWebページを作る!

Java Tips  java.io 編

Java Tips  java.lang 編

Java Tips  java.math 編

Java Tips  java.util 編

Java Tips  java.util.zip 編

Java Tips  java.text 編

Javaからデータベースを利用する