• 締切済み

Java Servletでのバックグラウンド処理

eclipseを利用してjavaのServletシステムの開発を行っております。 昨日納品したプログラム内で、エクセル出力処理があるのですが 一度に生成されるファイル数が多いため、実行側のブラウザでタイムアウトエラーが発生してしまいます (エクセル自体はサーバー側の所定の場所に正常に生成されている) そこで、エクセル出力処理をバックグラウンドで実行させ、ブラウザ側でタイムアウトとならないようにするという方針になりました いろいろWeb上の情報を調べてみましたが、解決には到っておりません 解決策をご存知の方、おりましたらお教えいただけたらと思います よろしくお願い致します

  • Java
  • 回答数1
  • ありがとう数0

みんなの回答

回答No.1

運用に関係してくるのですが、オンラインバッチにしてしまうのはどうでしょうか。 (1)最初のServletでは要求だけを受け付けて、excelを作成するJavaプログラムをキックする。「要求を受け付けました。受付番号はxxxxです。」を返す。 (2)excel作成プログラムがバックグラウンドで実行される(単なるJavaプログラム)。 (3)利用者は適当な間隔で当該バッチが終了したか確認し(Servlet)、excelが出来上がっていれば出力する。 excel作成プログラムはexcelファイル以外に作成完了を示すファイルを作成することでServletでの確認を容易にさせれば良いと思います。

関連するQ&A

  • servlet のbackground

    servletのプログラムが表示するHTML文書の 壁紙を設定したいのですが、よく分かりません。 c:/resin_home/webapps/myri/WEB-INF/classes の 中のservletのプログラム中で、 out.println("<body background=\"mypic/back.gif\">"); と出力しています。 mypicディレクトリはどこに置けばちゃんと表示されますか?

  • バックグラウンド処理をforkする意味

    初歩的な質問かもしれませんが… デーモンなどではなく、あくまでも通常のCGIスクリプトにおいて、何か重い処理をさせる場合は、STDOUTをcloseして処理はforkで生成した子プロセスにさせる、するとユーザーを待たせることなく(ブラウザをビジーから開放し)処理はバックグラウンドで実行される、という方法がよく見られるのですが、素朴な疑問があります。 ブラウザを開放させるにはSTDOUTをcloseすれば良い、 では、なぜ処理を子プロセスにさせなければならない? という点です。 一応、以下のような簡単なコードで試してみました。 ----------------- use Date::Format; my $log_file = 'hogehoge/test.log'; my $start = time2str('%m-%d %T', time); print "Content-Type: text/plain\n\n"; print "start:$start"; close(STDOUT); &heavy_exe($start); exit; sub heavy_exe { my $start = $_[0]; sleep(15); my $now = time2str('%m-%d %T', time); open(LOG, ">>$log_file") or &error('cant_open'); print LOG "$start\t$now\n"; close(LOG); } ----------------- 実行してみると、ブラウザはすぐさま開放される(読み込み完了になる)のと、15秒後にロギングも問題なく行われ、また本当に開放されていることを確認するために表示から15秒以内にリロードさせても、問題なく2プロセスとも動いていました。 以上を見る限りでは、forkなんてしなくても単にブラウザを開放するだけでいい、STDOUTをcloseするだけでバックグラウンド処理されると思うのですが、どうなのでしょう。 あるいは何か環境に依存した、子プロセスにさせなければならない理由などがあるのでしょうか。 よろしくお願いいたします。

    • 締切済み
    • CGI
  • バックグラウンドでの処理

    C言語のカテゴリで質問しようか迷いましたが動きはシェル関連なので質問させてください. 例えば,以下のようなCソースがあったとします. 1 #include<iostream> 2 3 int main(int argc, char *argv[]) 4 { 5 6 for (int i = 0;; i++) { 7 8 std::cout << "0" << std::endl; 9 } 10 11 return 0; 12 } 実行ファイル名を0として ./0 & としましたが,0が連続的に出力されるだけでした. バックグラウンドで処理させているはずなのになぜ0が出力されるのでしょうか?

  • -Servlet外でのHTML出力-

    お世話になります。 Servletの処理で・・・ PrintWriter out = res.getWriter(); out.println("<html><body>"); out.println("<form>"); out.println("<td>HelloWolrld</td>"); out.println("</form>"); out.println("</body></html>"); out.close(); ・・・のようなHTML出力がありますが、 セッション切れ後の処理(HttpSessionBindingListener 実装)で同じように画面にHTMLを出力する方法はありませんか?? セッションが切れた状態では無理な気がするのですが・・・ ・・・何とかなりませんか??

    • ベストアンサー
    • Java
  • Windowsで重い処理を実行したい

    CGIを作成している環境が Windows2000+IIS+ActivePerlで、時間がかかる処理を 行うプログラムを作成しています。 いろいろ調べて、alarm()とシグナルでブラウザタイムアウトを 防ぐ方法や、forkして子プロセスする方法などを、 試したのですが、うまくいかず、 よくよく調べてみるとWindows環境だと、alarmもforkも未実装らしく困り果てています。 IISでタイムアウト時間を延ばすのは避けたいです。 ブラウザのタイムアウトを回避しつつ、処理の長い CGIを実行するいい方法はないでしょうか?

    • ベストアンサー
    • Perl
  • PHPのバックグラウンド処理でタイムエラー?

    PHPで定期的にサイトの更新を把握するため、fopenで呼び出すプログラムを作っています。 SYSTEM関数でバックグラウンド処理を行っているのですが1時間くらいするといつのまにか処理がストップしてファイルへの出力がとまってしまいます、タイムエラーにしては毎回停止する時間が違うので他の原因のような気がするのですが・・・ なにが原因かわかる方いませんでしょうか?回答よろしくお願いします。

    • ベストアンサー
    • PHP
  • eclipse servlet 404対処方法

    初めて質問させて頂く者です。宜しくお願いします。Java初心者です。 eclipse4.3のtomcatプロジェクトを使い、以下のServletコードを作成しました。 ブラウザアドレスバーに以下アドレスを入れて実行しましたが、HTTPステータス404が表示されます。 どのように改善したら良いかアドバイスをお願い致します。長文申し訳ございません。本当に困っています。 環境:windows8.1 eclipse4.3 ディレクトリ:jwapp(プロジェクト名) -test(パッケージ名) -First(ファイル名) 指定アドレス:localhost:8080/jwapp/servlet/test.First web.xmlファイルはWEB-INFの中に置いています。 記述は以下のとおりです。↓ <?xml version="1.0" encoding="ISO-8859-1"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd"> <servlet> <servlet-name>first</servlet-name> <servlet-class>test.First</servlet-class> </servlet> <servlet-mapping> <servlet-name>first</servlet-name> <url-pattern>/first</url-pattern> </servlet-mapping> </web-app> Servletのコードは以下のとおりです。↓ package test; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class First01 extends HttpServlet { public void doGet(HttpServletRequest req,HttpServletResponse res) throws IOException,ServletException{ res.setContentType("text/html;charset=Shift_JIS"); PrintWriter out=res.getWriter(); out.println("<html)"); out.println("<head>"); out.println("<title>テスト</title>"); out.println("<h1>テスト</h1>"); out.println("</body>"); out.println("</heml>"); } }

    • ベストアンサー
    • Java
  • rshを使うスクリプトをバックグラウンド実行

    Linux+Perlでのお話です。 内部でsystem関数を使ってrshコマンドを実行しているperlスクリプト(以下、スクリプトAという)があります。 スクリプトAをフォアグラウンドで実行するとうまく流れるのですが、バックグラウンド実行すると、rshコマンドを実行した直後でjobが止まってしまいます。 もっと詳しく言いますと、スクリプトAのrshコマンドは、ディスクを共有しているリモートマシンに対して、スクリプトBを実行するように指示しています。 スクリプトBではとある計算を行なっており、その計算結果をファイルに出力しています。 そして、その結果をスクリプトAで読み込んで後処理を行うというものです。 ----- …(前処理)… system("rsh (ホスト名) \"(スクリプトB実行コマンド及び引数) 1> /dev/null 2> /dev/null\""); # ここでjobが止まってしまいます。 # ここで標準出力(ログファイルにリダイレクトしてる)に何か出力しようとしても、何も出力されてません。 (スクリプトBの結果ファイルの読み込み) …(後処理)… ----- Jobが止まってしまうと言っているのは、jobsコマンドで見ると"job stopped"となっている状態のことを言っています。 この状態でスクリプトBの結果はファイルに出力されているので、rshのコマンドはうまく投げられていると思います。 (「rshやsshは標準入力が期待されてるとバックグラウンド実行が出来ない」(?)というような記述をどこかで見かけたので、念のためrshに"< /dev/null"の記述を加えてもみたのですが、変わりませんでした) その後、止まっているjobをfgコマンドでフォアグラウンドで再開させると、最後まで問題なく実行されます。 フォアグラウンドで実行すればうまくいくのに、バックグラウンドで実行すると止まってしまうのが理解出来ません。 これは何が原因なのでしょうか。 そして、どうしたら解決出来るのか。 どなたかご存知でしたら、ご教示頂きたくお願い致します。

    • ベストアンサー
    • Perl
  • jsp、servletのリモートデバッグについて

    eclipseを利用し、jsp、servletで開発を行おうとしているのですが、 リモートデバッグの方法が分かりません。 以前、開発環境と、実行環境が同じ環境下においてのリモートデバッグは 行ったことがあるのですが、今回は環境が別々になっています。 このような場合はどのような設定を行えばよいのでしょうか。 なおサーバー側の「catalina.bat」に以下の行を追加しています。 set JAVA_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 【実行環境】 CentOS5 tomcat6 apache2.2 【開発環境】 WindowsXp Eclipse 宜しくお願いいたします。

  • eclipseでexcelデータを扱うプログラムを作成する方法

    excelデータを読み込んでブラウザで表示するJavaによるWebアプリケーションを eclipseを使って作ろうとしています。 ところが、本やインターネットで探しても eclipseを使用してexcelデータを扱うプログラムを作る例が見当たりません。 POIを使ってexcelデータを読み込む方法は見つかり、 それを参考にしたプログラム(JSP)は成功しました。 そしてそれをeclipseで再現しようとしたところ、うまくいきません。 そこで「もしかするとeclipseを使ってexcelデータを扱うプログラム(Java Servlet/JSP)を 作るのは一般的ではないのだろうか?」という疑問がわいてきました。 excelデータの処理以外にも、いろいろプログラムを作ってみたいので これからもeclipseを使いたいのですが、excelデータを使ったプログラムだけは eclipse以外で作ることになるのでしょうか? eclipseでexcelデータを扱うプログラムを作ることが 一般的ではないのかどうか、だけでも構いませんので どうぞよろしくお願いいたします。