サーブレットが実行されるタイミングは?


通常は、サーバにアクセスされると、サーブレットのクラスが呼び出されて実行すると思うのですが、クローラのようにユーザにアクセスされる前にあらかじめ実行しておきたいプログラムはどのようにすればよいのでしょうか?

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/03/22 01:01:13
  • 終了:2010/03/29 01:05:02

回答(4件)

id:Km1967 No.1

Km1967回答回数224ベストアンサー獲得回数352010/03/22 01:16:45

ポイント23pt

Webサーバ経由で起動するのではなく、サーバ上でタイマー起動するようにする。

cronというコマンドがよく使われているが、サーバによって使い方が微妙に違う。

http://www.linux.or.jp/JM/html/cron/man5/crontab.5.html

http://ja.wikipedia.org/wiki/Crontab


もう少し具体的対応方法が知りたければ、

どこのレンタルサーバか? 自前ならOSは何か? などを返答すれば得られるであろう。

id:rapuntuleru

自前サーバでLinuxを想定してます。ディストリビューションはUbuntuかCentOSを想定してます。

2010/03/22 01:27:35
id:Km1967 No.2

Km1967回答回数224ベストアンサー獲得回数352010/03/22 01:45:02

ポイント23pt

CentOSなら、ちょうどよさそうなページを見つけてきた。

cronの基本的使い方が一通り載っておるから消えぬうちに印刷でもしておいたら便利だろう。

http://centlinuxer.blog37.fc2.com/blog-entry-36.html


Ubuntuであればgnome-scheduleを使ってcronの設定を行うと楽なのだが日本語のページがいまいち見当たらん。

(gnome-scheduleはUbuntu専用ではなく他でも採用されていたりする)

http://sourceforge.jp/projects/sfnet_gnome-schedule/

http://gnome-schedule.sourceforge.net/


いずれの場合もコマンドラインからcronの設定を行うのであれば設定の保存先以外は特に違いはない。

設定の保存先はディストリビューションが同じでもバージョンが違えば異なる場合もあるため正式に決まってから探せばよいだろう。

id:pyopyopyo No.3

pyopyopyo回答回数337ベストアンサー獲得回数792010/03/22 03:17:37

ポイント22pt

cron のような古い技術をわざわざ使うと、かえってややこしくなりますよ。

servletは cgiやphp とは全く異なり、クラスのインスタンスがjava VM上に常駐して動作します。そもそも常駐して動作するものなので、 cron 等は不要です。

具体的には、servletのクラスのコンストラクタにて 新しいスレッドを生成して、

そのスレッドの中でクロールする処理の無限ループを書けばOKです。コードとしては、たとえばこんな感じです

/* クロールする処理のスレッド */
class WorkerThread extends Thread {
  public WorkerThread() {
     start();
  }
  public void run() { 
      while (true) {
        /*  クロールする処理 */
      }
  }
};
public class MyServlet extends HttpServlet {
   static private WorkerThread workerthread = new WorkerThread();
    
    public void service(HttpServletRequest request, 
                      HttpServletResponse response)  throws ServletException, IOException {
    }
};

tomcatを使っているとすると、動作としては

  • tomcatを起動
  • MyServlet への初回アクセス(POSTとかGETとか)時に、tomcatが MyServlet の最初のインスタンスを生成。
  • 生成されたMyServletのインスタンスは、スレッドとして起動
  • MyServletの初期化時に、さらに WorkerThread スレッドが起動
  • 二つのスレッドが並行して以下の処理を行う

- POSTとかGETのリクエストは service() で処理。処理が終了したあとは、つぎの POST とか GETのリクエストが来るまで待機。

- workerthread はひたすらクロールする処理を繰り返す

となります。

これで、workerthreadが終了しない限り、 tomcatを停めるまで、ひたすらクロール処理が継続されます。


この方法をさらに発展させて、tomcat設定をちょっと変えれば

  • tomcat起動
  • 即、tomcatが MyServlet のインスタンスを生成
  • 即、WorkerThread スレッドが起動

ということが出来ます。詳細はservletの書籍等で調べてみてください。たぶんパフォーマンスチューニングの章に載ってます。

id:ko8820 No.4

ko8820回答回数1221ベストアンサー獲得回数692010/03/22 19:57:06

ポイント22pt

クローラのように定期バッチのような動作をさせるのは、

cronをつかって、Javaアプリとして作成するのが普通です。

回答3のようなやり方はお勧めしません。

クローラとサーブレットは別VMで動作させたほうが良いですし

個人的には、無限ループをするようなスレッドをかくのはどうかとは思います。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません