- PR -

Servletでの処理中メッセージ(プログレスバー等)の表示

1
投稿者投稿内容
くりお
常連さん
会議室デビュー日: 2004/01/30
投稿数: 34
投稿日時: 2004-05-09 23:32
Servletの処理が重い(数十秒の処理時間)ため、
AntのSplashタスクのような処理中メッセージ or プログレスバー等を使用して、
処理中であることをエンドユーザに表示したいと考えています。

※本来は非同期処理にすべき個所ですが、都合上同期処理にしなければなりません。
※ブラウザ右上の地球の回転で処理中が分かりますが、もう少し目立つ処理中メッセージが必要とされています。

このように、サーバに一旦リクエストを送信した後に、
クライアント側にて何らかの処理を行うことは実現可能なのでしょうか?

おそらく
 1)Servletで別Threadを起動して処理
 2)JavaScriptで表示
で実装すれば何とかなるのかもしれませんが、実現方式が思いつきません。

そのようなコーディング例や
Jakartaでのユーティリティクラスなど情報がございましたらご教授願います。


[ メッセージ編集済み 編集者: くりお 編集日時 2004-05-10 01:28 ]
せん
ぬし
会議室デビュー日: 2002/03/04
投稿数: 397
投稿日時: 2004-05-10 04:17
引用:

このように、サーバに一旦リクエストを送信した後に、
クライアント側にて何らかの処理を行うことは実現可能なのでしょうか?

おそらく
 1)Servletで別Threadを起動して処理
 2)JavaScriptで表示
で実装すれば何とかなるのかもしれませんが、実現方式が思いつきません。



アプレットでも使用すればなんとか行けそうな気がします。
ブラウザだけでは無理かとおもいますが。

数十秒の処理の方をどうにか、ばらせるようにするほうが正しいとは
おもいますが。。。無理なんでしょうね。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-05-10 06:50
[Servletで別Threadを起動して処理]について簡単なコード例が以下にあります。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=7110&forum=12

長期の処理であれば一般的には MDB を使うのが妥当でしょう。
くりお
常連さん
会議室デビュー日: 2004/01/30
投稿数: 34
投稿日時: 2004-05-10 09:54
返信ありがとうございます。
本来はご意見のとおり、処理を分割したり、MDBを使用すべきだと思いますが、
いろいろな都合上、オンライン同期処理を行わなければなりません。

> せんさん
やっぱり、AppletなどRichクライアントが必要になるのでしょうねぇ。
ここら辺がThin クライアントの限界なのでしょうか・・・


> インギさん
別Thread起動の情報のご提供ありがとうございます。
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2004-05-10 11:59
 私が只今、設計しているシステムでも、
同様な要求がユーザーさんからありました。
この要求に対して、とりあえず、
下記のような感じのHTMLを作成してみました。
こんな感じでなんとかいけそうな気がしてます。

コード:
//検索画面
<HTML>
  <HEAD>
    <TITLE>検索画面</TITLE>
  </HEAD>
  <SCRIPT LANGUAGE="JavaScript">
  <!--
    function search(){
        window.open('search2.html','検索中','directories=no,location=no,menubar=no,scrollbars=no,status=no,toolbar=no,resizable=no,width=200,height=200');
    }
  -->
  </SCRIPT>
  <BODY>
    <FORM>
      <INPUT TYPE="BUTTON" VALUE="検索" onClick="search()">
    </FORM>
  </BODY>
</HTML>

//検索中画面
<HTML>
  <HEAD>
    <TITLE>検索中</TITLE>
  </HEAD>
  <SCRIPT LANGUAGE="JavaScript">
  <!--
    function search(){
        window.open('search3.html','検索','directories=no,location=no,menubar=no,scrollbars=no,status=no,toolbar=no,resizable=no,width=200,height=200,left=100000');
    }
  -->
  </SCRIPT>
  <BODY onLoad="search()" onUnload="opener.location.reload();">
    <FORM>
      <B>只今、検索中です</B>
    </FORM>
  </BODY>
</HTML>

//隠し画面
//※ここで実際の検索が行われる
<HTML>
  <HEAD>
    <TITLE>隠し画面</TITLE>
  </HEAD>
  <SCRIPT LANGUAGE="JavaScript">
  <!--
    function search(){
      opener.close();
      self.close();
    }
  -->
  </SCRIPT>
  <BODY onLoad="setTimeout('search()',3000)">
  </BODY>
</HTML>

(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2004-05-11 11:45
引用:

インギさんの書き込み (2004-05-10 06:50) より:
[Servletで別Threadを起動して処理]について簡単なコード例が以下にあります。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=7110&forum=12

長期の処理であれば一般的には MDB を使うのが妥当でしょう。



servletからthreadを起動することができれば
非常に便利だとは思っています。

しかし、博識ではありますが、servletからの
thread起動ってお作法としてあまりよろしく
ないとされていませんでしたっけ?

そういう事が今まで頭にあったので、なるべく
しないよう心がけてはいたのですが、大丈夫
なのでしょうか?

以前、私もサーバのメモリ参照のためのツール
をservletからthread起動で監視するタイプで
作りましたが、某ApServerでは起動時点ではじか
れてしまいました。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2004-05-11 12:03
補足

どうやら、servletの仕様としては
明確に書いてあるわけでもないようです。

webを調査してたらJavaHouseにて下記の
記事を見ました。

http://java-house.jp/ml/archive/j-h-b/047924.html

ただ、以前私が扱ったサーバ(日立のコズミネキサス5)
ではservletからのthread起動をサーバ起動時に監視
しているみたいで、怒られた記憶があります。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-05-12 05:06
はい、その通りサーブレットに関わらずコンテナ管理外のスレッド起動は大変大きなコストを伴いますのであまりお勧めはしません。
あくまでゴリ押しのソリューションとして挙げました。
サーブレットの仕様上は問題ありませんが。

トラフィックの少なめのイントラならなんとかなるかもしれませんがインターネットからアクセス可能のサイトで、簡単なリクエストでぼこぼこスレッドを起動するようなつくりでは簡単に OutOfMemoryError に陥りますのでへたな CGI よりタチが悪いです。

ですので J2EE 的な作法としては MDB を使うのが正攻法です。実装もとても簡単ですし。

不用意にたくさんのスレッドの起動を防止する方法としては commons-ThreadPool を使う方法もありますね。
同等のものを自分で実装しても良いですが、スレッド回りはしばしば火種になるので細心の注意が必要です。
http://jakarta.apache.org/commons/sandbox/threadpool/

どのような実装方法をとるにせよ JMeter 等で十分に負荷テストをしてサイジングを適切に行っておくのは重要です。

[ メッセージ編集済み 編集者: インギ 編集日時 2004-05-12 05:08 ]
1

スキルアップ/キャリアアップ(JOB@IT)