2012-03-01 7 views
0

マルチパートデータ(xls)を生成するために使用されるjspページがあります。 このJSPページではデータが取得されませんが、ログにデータを印刷しようとすると、すべてのレコードが取得されたことがわかります。リクエストタイムアウト、jspページのレンダリング中に接続がリセットされたエラー

どのようにリクエストが処理されますか。

Request ---(goes to)---> Webservlet ---(delegate to handler)---> Java Class(ReportHandler.java)

今、私たちは、データベースからデータを取得する責任があるReportHandler.runReport()のメソッドを呼び出します。このメソッドは、レコードをフェッチするのに時間がかかります(ほぼ12分)。 結果セットでデータを取得したら、jspページに渡し、結果セットを使用してレポートを生成します。

1> while(rs.next()) {system.out.println("<tr><td>"+partnerId+"</td></tr>")}

私はPARTNERIDを見ることができます - それは、コンソールにプリントなっています。 しかし、JSPはブラウザ上でデータをレンダリングしていません。 12〜14分後、ブラウザにエラーメッセージ(ステータスコードなし)が表示され、要求がタイムアウトして接続がリセットされました。

私の質問は、サーバーで接続がタイムアウトした後、データがコンソールに表示されず、接続がクライアント側でタイムアウトしてから修正する方法で、タイムアウトを修正しようとしました。 network.http.connection.timeoutプロパティをlongに設定しても効果はありません。

2> I am using out.print(<table><tr><td>"+rs.getInt(partnerId)+"</td></tr></table>")

レポートを生成するが、data(out.flush())が強制的にフラッシュですが、それは、JSP上の任意のデータを生成していません。 上記のSystem.out.println()がwhileループでレコードを出力しているので、私はjspページでデータを取得していますがレンダリングしていないと確信しています。

私は解決策を探していますが、それを解決する手がかりを得られなかったので、長い間助けてください。

答えて

0

バックエンドの時間を妥当なもの(5〜10秒未満で、視聴者の種類によって異なる)に縮小できない場合は、パターンを変更する方がよいでしょう。意味がある場合は、指定した時刻に文書の作成をスケジュールすることができます(Quartzなど)。それ以外の場合は、何らかのサーバー通知が必要になります。長いポーリングはリソースの浪費であり、専用の彗星サーバーはこのことだけに意味がないので、古いJavascriptポーリングをお勧めします。基本的には、ドキュメントが準備完了しているかどうかを毎秒X秒ごとに確認するスクリプトがあります。 2つの異なるスクリプトを実装することによって、このパターンに従うようにサーバー側スクリプトを修正します。一方は実際の作業を行い、他方はバックグラウンド・プロセスとその状態の表を管理し、もう一方のスクリプトによって通知されます。これは擬似コードによる実装です

//~client 
every 30 seconds check /document?id=12345 { 
    if (ready) { 
    display URL for download 
    break 
    } else { 
    display loading.gif 
    } 
} 

//~server (worker) not reachable by public URL, it's a background thread 
notify: processing document with id #1234 
.... do processing .... 
notify: finished document with id #1234 

//~server (notifier) has a URL like /document?id=1234 
if (#1234 isReady) 
    output #1234.URL 
else 
    output "processing..." 
関連する問題