- - PR -
JSPエラー「アクセス中のURL〜」について
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2003-10-27 19:49
こんにちわ。みーちくです。
久しぶりの投稿になります。 皆様、宜しく御願い致します。 [環境] tomcat3.2.3 j2sdk-1_4_1_01 j2sdkee-1_3_1 [処理の流れ] 1.入力された製造番号がDBに存在しない場合は、製造番号を登録 2.製造番号登録クラス実行(synchronizedとしております。) 3.製造番号登録クラスが正常終了(true)した場合、DBをもう一度チェック 4.DBに登録されていた場合、新規画面へ遷移 5.DBに登録されていなかった場合、エラー画面へ遷移 [テスト] 1)A(Win),B(Mac) Aより処理を開始 2)Aが製造番号登録クラスを実行している場合、Bは待ち 3)Aの製造番号登録クラス処理が終了 Bの製造番号登録クラス処理開始 4)AのDBチェック終了 新規画面へ遷移 5)Bの製造番号登録クラス処理が終了 6)BのDBチェック終了 上記のような環境でテストした結果、必ずMacIE5.0の場合、下記のようなエラーメッセージ (alert画面)が表示され、プログラムが正常終了していても、画面が遷移できません。 Macから先に処理した場合はエラーメッセージは表示されません。 また、1件のみで処理した場合もエラーメッセージは表示されません。 「アクセス中のURL:http://hogehoge.co.jp/dtp/servlet/sinseiの読み込みに 失敗しました。」 皆様、宜しくご指導下さい。 | ||||
|
投稿日時: 2003-10-27 20:24
>(alert画面)が表示され、プログラムが正常終了していても、画面が遷移できません。
>Macから先に処理した場合はエラーメッセージは表示されません。 >また、1件のみで処理した場合もエラーメッセージは表示されません。 > >「アクセス中のURL:http://hogehoge.co.jp/dtp/servlet/sinseiの読み込みに >失敗しました。」 こういったケースではパケットキャプチャを行うのが手っ取りばやいです。 ・[Ethereal] http://www.ethereal.com/ ちゃんと通信が行われていることがわかっているケースでは私はよく Apache-Axis に付属する tcpmon を使います。これを起動して、IE のプロキシサーバとして設定すると通信内容がわかります。 ・Apache-Axis User's guide http://ws.apache.org/axis/java/user-guide.html >tomcat3.2.3 >j2sdkee-1_3_1 関係ないですが、バージョンがあっていない気がします。Tomcat3.x は ServletSpec2.2 で、J2EE1.3.1 は ServletSpec2.3 ではないでしょうか?2.3 の機能を使っていなければ特に問題にはならないかもしれませんが。ビルド環境と実行環境の API はあわせておくのが無難かと思います。 | ||||
|
投稿日時: 2003-10-28 14:10
インギさん
返信ありがとうございます。 また、返事が遅くなって申し訳ございません。
私は、パケットキャプチャをやった事がなく、よくわからないのですが、 早速、Etherealを入れてみました。 tcpmonはまだなんですが、気になるエラー箇所がありました。 エラーは下記のように出力されました。 もうちょっと調べてみたいと思います。 また、MAC IEのブラウザを5.0 → 5.1.7にバージョンアップした所、 エラーは出ませんでした。 Internet Protocol options: (4 bytes) Router Alert: Every router examines packet | ||||
|
投稿日時: 2003-10-29 12:06
みーちくです。
いろいろテストした結果、ブラウザが原因のような気がしてきました。 A画面から実行ボタンを押下し、下にも書いたような処理が実行されるのですが、 MAC IE5.0のアドレスバー?には「要求を送信中:/dtp/servlet/sinsei」と 出力されているのですが、5分程時間が経過した場合には、 「インターネットゾーン」に出力が変化し、あのエラーメッセージが表示されます。 とりあえず、ご報告いたします。 | ||||
|
投稿日時: 2003-10-29 14:17
>いろいろテストした結果、ブラウザが原因のような気がしてきました。
そうですね。ブラウザによって挙動がちがうし、アップデートすると回避できるところからして。 Classic なら 5.1.7、OSX なら 5.2.0 / Safari を使うのが無難そうですね。 ・Mactopia -> IE http://www.microsoft.com/japan/mac/products/ie/default.asp?navindex=s7 #サポート情報には事例がちょっと見当たりませんが。なにか改善されてるのかも? http://www.microsoft.com/japan/mac/support/default.asp?navindex=s15 http://www.microsoft.com/japan/mac/support/default.asp?contents=01&navindex=s15 http://www.microsoft.com/japan/mac/support/default.asp?contents=02&navindex=s15 | ||||
|
投稿日時: 2003-10-29 15:05
みーちくです。
インギさん。 返信及び情報ありがとうございます。 私の上司からは、ブラウザのバージョンアップは却下されて しまいました。 また、製造番号登録クラス実行で処理を分割するという案も 却下されてしまいました。 もう少しがんばってみます。 ありがとうございました。 | ||||
|
投稿日時: 2003-10-29 18:03
>私の上司からは、ブラウザのバージョンアップは却下されて
>しまいました。 >また、製造番号登録クラス実行で処理を分割するという案も >却下されてしまいました。 なるほど。結構大変ですね。現実的にはすべてのクライアントにアップデートしてもらうのは難しいですよね。 長時間レスポンスがないとエラーになるとのことなので、処理を別スレッドで実行させてひとまずレスポンスを返してしまうというのはいかがでしょうか? もちろんレスポンスには <meta HTTP-EQUIV="Refresh" CONTENT="5; URL=/checkServlet"> などとし、定期的に処理が終了していないかチェックするスレッドをポーリングさせるのです。 とりあえず動かすのであれば、スレッドに HttpSession を渡して new / start して処理が終わったら結果オブジェクトを setAttribute() させれば良いでしょう。 あまり負荷のかかるサーバだったら JMS/MDB などを作ってきちんとコンテナにスレッド管理してもらうのが楽ですが。 説明が悪そうなので、以下にごりごりとそれっぽいコードを書いてみます。 //処理をキックするサーブレット public void get(HttpServletRequest req,HttpServletResponse res){ 別処理 anotherThread = new 別処理(req.getSession()); anotherThread.start(); チェックするサーブレットへforward(); } //チェックするサーブレット public void get(HttpServletRequest req,HttpServletResponse res){ HttpSession session = req.getSession(); ResultBean result = (ResultBean)session.getAttribute("結果"); response.setContentType("text/html ;charset=UTF-8"); PrintWriter writer = response.getWriter(); if(null == result){ //まだ処理終わってない writer.println("<html><head><meta HTTP-EQUIV=\"Refresh\" CONTENT=\"5;URL=/checkServlet\"></head><body>処理中です。しばらくお待ちください。</body></html>"); }else{ //処理が終わった writer.println("<html><head><meta HTTP-EQUIV=\"Refresh\" CONTENT=\"5;URL=/checkServlet\"></head><body>処理中が終了しました。</body></html>"); } } //別処理.java public class 別処理 extends Thread{ private HttpSession 呼び出した人のセッション; public 別処理(HttpSeession session){ this.呼び出した人のセッション = session; } public void run(){ //時間のかかる処理 ResultBean result = 何かの処理結果; this.呼び出した人のセッション.setAttribute("結果",result); } } [ メッセージ編集済み 編集者: インギ 編集日時 2003-10-29 18:05 ] | ||||
|
投稿日時: 2003-10-29 19:13
みーちくです。
インギさん。 大感謝&感激です。 別スレッドにするという事もできたのですね。 私はスレッドは使った事がありませんでした。 お恥ずかしい 私の技術力で出来る範囲の事を考えてみました。 私もインギさんと同じようにとりあえず、レスポンスを返そうと考えました。 以下が私が考えた処理です。 @入力された製造番号がDBに存在しない場合 A画面表示 AA画面より、実行ボタン押下時、Servletへ処理移行 BServletから製造番号登録クラス実行及び B画面へ遷移 CB画面より、製造番号登録クラスで出力されたファイル5秒間隔でチェック Dout.txtが存在していた場合 C画面へ遷移 EC画面より、製造番号登録クラスで出力されたファイル5秒間隔でチェック Fcopy.txtが存在していた場合 D画面へ遷移 GD画面より、製造番号登録クラスで出力されたファイル5秒間隔でチェック Htake.txtが存在した場合、処理が全て終了となる 補足 製造番号登録クラスには、3つのメソッドがあります。 各メソッドの処理が終了した場合、テキストファイルを作成 ・出力処理 out.txt ・コピー処理 copy.txt ・取り込み処理 take.txt | ||||
