- PR -

jspでタイムアウトさせないためには?

投稿者投稿内容
なぎ
会議室デビュー日: 2004/11/17
投稿数: 12
投稿日時: 2004-11-24 12:00
お世話になっています。

またもや初心者な質問で申し訳ないのですが、袋小路にはまってしまい投稿させていただきます。
現在IBM WebShpereを使用して開発を行っているのですが、最終的にjspを表示させるところでブラウザがタイムアウトを起こしてしまって表示ができません。
なにぶんデータが大きい為処理に時間がかかってしまいます。
使用はイントラで使用者も限られているので処理時間の問題ありません。

やっている事は以下です。
1)jsp1で取ってくるデータの日付を指定

2)servletに引きわたし

3)servletからjsp2を起動

4)jsp2でJavaBeanを起動してDBからデータの取得を行う

5)jsp2でテキストファイルを作成

6)jsp2でFor文でJavaBeanにて取得したデータを無くなるまでテキストファイルに書き出し

7)jsp2で処理が終わった事を画面表示させる

以上です。
6の時点で時間がかかってその間にタイムアウトになってしまい7)を実行しないまま
ブラウザに「ページを表示できません」と表示されてしまいます。
テキストファイルへの書き込みは行われています。
タイムアウト処理をさせないためには6)のFor文でまわしている時点で
何かブラウザに情報を渡した方がよろしいのでしょうか?
そうなると、データのやりとりが大量発生してしまってサーバーに負荷がかかりませんでしょうか。
何も思いつかず四苦八苦しています。
良い案がありましたらご教示下さい。よろしくお願いします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-11-24 12:30
こんなのどうでしょう? MDB か別スレッドを使うっていう方法。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=7110&forum=12
なぎ
会議室デビュー日: 2004/11/17
投稿数: 12
投稿日時: 2004-11-24 13:59
インギ様

さっそくの返答ありがとうございます。
リンク先拝見させていただきました。
MDBもスレッドも初めて聞く単語だったので調べてみましたがスレッドとはServletに記述するものなのでしょうか?
それは新しいServlet.javaを作成するという事ですか?
全然理解できていなくて申し訳ありません。
実は前任者が作成してすでに動いているものなので、あまりプログラム自体の構成が変わるような事ができません。
となると、やはり6)でテキストに書き出しをしているところに何かブラウザに値を返してやるようなものを記述する方法しかないでしょうか。
せっかく教えていただいた方法を否定してしまって申し訳ありません。
どうかご教示お願いします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-11-24 14:01
>となると、やはり6)でテキストに書き出しをしているところに何かブラウザに値を返してやるようなもの
>を記述する方法しかないでしょうか。
すでにアイディアがあるのであればまず試してみてはいかがでしょうか?
なぎ
会議室デビュー日: 2004/11/17
投稿数: 12
投稿日時: 2004-11-24 14:50
そうですね。実際にやってみました。
アイディアはあるのですがどうやったらいいかわからずにとりあえず
for文内に <meta http-equiv="Refresh" CONTENT="5; URL=/処理中とメッセージのあるjspを指定">
とやってみたのですが処理中に表示が出てくれなく、処理終了後に表示が出てしまいました。
基礎もわかっていないような事でお手数かけて申し訳ありません。
このような事をやっています。
長くなって申し訳ありません。
ブラウザに「処理中である」と返したい時はどのようにすればよいのでしょうか?


<%@ page contentType="text/html; charset=shift_jis" %>
<%@ page errorPage="error_message.html" %>
<%@ page import="java.util.*,java.io.*"%>
//csvWriteBeanとはデータをDBから取得するBeanです
<jsp:useBean id="result" class="Web.CsvWriteBean" scope="request" />

<%
String DAY1 = ""; //To
String DAY2 = ""; //From

<中略>

//ここでデータの取得を行う(何日〜何日までのデータを取得しろ)
result.execute(DAY2,DAY1);

//作成するファイル名とパスを指定
File csvfile = new File("D:/IBM/wsappdev51/workspace/Web/Data/source/"+DAY2+".txt");
File delfile = new File("D:/IBM/wsappdev51/workspace/Web/Data/source/"+DAY3+".txt");

csvfile.createNewFile();
FileOutputStream os = new FileOutputStream(csvfile);
PrintWriter output = new PrintWriter(os);

//データにエラーがなかったか判定(データ取得時にエラーがあれば-1が返る)
if (result.getSumCount() != -1){
//データの件数を判定
if (result.getSumCount() != 0){
//データの件数が0件でなかった場合データをテキストファイルに書き出す
//Bean内の関数でデータを配列から取り出し引数で返しています。
for(int i=0;i<=result.getSumCount();i++){
output.println(
result.getID(i) + "," +
result.getPDID(i) + "," +
result.getEQP(i) + "," +
result.Lot(i)
);
%>


<meta http-equiv="Refresh" CONTENT="5; URL=/CmpReworkWeb/test.jsp">



<%}%>

<%} else {
str="0";
}
} else {
str="error";
}
output.close();
os.close();

if (delfile.delete()){
str2 = DAY3 + ".txt を削除しました。";
} else {
str2 = DAY3 + ".txt を削除しようとしましたが、削除できませんでした。";
}
%>
<html lang="ja">

<head>
<title>Daily CSV Write</title>
</head>

<body>

<div><h3>CSV保存期間</h3></div>
<div>&nbsp;&nbsp;&nbsp;<font color="Blue"><b><%=DAY2%></b></font>&nbsp;〜&nbsp;<font color="Blue"><b><%=DAY1%></b></font></div>

<div><br><br></div>

<div><h3>1ヶ月経過により、削除されるファイル</h3></div>
<div>&nbsp;&nbsp;&nbsp;<FONT color="Blue"><B><%=DAY3%>.txt</B></font></div>
<div><br></div>
<div>&nbsp;&nbsp;&nbsp;ステータス:<%=str2%></div>

<div><% if (str.equals("0")){%>レコード:0件<%}%></div>
<div><% if (str.equals("error"))
{%>エラーが発生しました<%}%></div>
</body>

</html>
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-11-24 14:59
>for文内に <meta http-equiv="Refresh" CONTENT="5; URL=/処理中とメッセージのあるjspを指定">
>とやってみたのですが処理中に表示が出てくれなく、処理終了後に表示が出てしまいました。
flush していないからではないでしょうか。

>ブラウザに「処理中である」と返したい時はどのようにすればよいのでしょう
先ほどポイントしたスレッドも参考になると思います。
ServletでもJSPでもやり方に変わりはありません。
処理を継続しながらクライアントに画面をリフレッシュさせつづけるのであればスレッドを起こす必要があると思います。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=7110&forum=12
なぎ
会議室デビュー日: 2004/11/17
投稿数: 12
投稿日時: 2004-11-24 15:41
インギさま

たびたび返答ありがとうございます。
>flush していないからではないでしょうか。
flushとは
<jsp:include page="test.jsp" flush="true" />
の一文でしょうか?

>先ほどポイントしたスレッドも参考になると思います。
>ServletでもJSPでもやり方に変わりはありません。
>処理を継続しながらクライアントに画面をリフレッシュさせつづけるのであればスレッドを起こす必要があると思います。
先ほどの投稿を読ませていただいたのですが、どうしたらいいかさっぱり検討がつきません・・・
勉強不足を切々と感じます。
もう一度熟読させていただきます。ありがとうございます。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-11-24 15:53
> <jsp:include page="test.jsp" flush="true" />
この flush と同じ事です。なんで flush が必要かというと、通常レスポンスに書き出した html は一旦バッファされてjsp やサーブレットの処理が終了した際、またはバッファがあふれるタイミングに一気にブラウザに出力されるからです。
が、わざわざ include することはありません。
http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/ServletResponse.html#flushBuffer()

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