通常は、サーバにアクセスされると、サーブレットのクラスが呼び出されて実行すると思うのですが、クローラのようにユーザにアクセスされる前にあらかじめ実行しておきたいプログラムはどのようにすればよいのでしょうか?
Webサーバ経由で起動するのではなく、サーバ上でタイマー起動するようにする。
cronというコマンドがよく使われているが、サーバによって使い方が微妙に違う。
http://www.linux.or.jp/JM/html/cron/man5/crontab.5.html
http://ja.wikipedia.org/wiki/Crontab
もう少し具体的対応方法が知りたければ、
どこのレンタルサーバか? 自前ならOSは何か? などを返答すれば得られるであろう。
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の設定を行うのであれば設定の保存先以外は特に違いはない。
設定の保存先はディストリビューションが同じでもバージョンが違えば異なる場合もあるため正式に決まってから探せばよいだろう。
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を使っているとすると、動作としては
- POSTとかGETのリクエストは service() で処理。処理が終了したあとは、つぎの POST とか GETのリクエストが来るまで待機。
- workerthread はひたすらクロールする処理を繰り返す
となります。
これで、workerthreadが終了しない限り、 tomcatを停めるまで、ひたすらクロール処理が継続されます。
この方法をさらに発展させて、tomcat設定をちょっと変えれば
ということが出来ます。詳細はservletの書籍等で調べてみてください。たぶんパフォーマンスチューニングの章に載ってます。
クローラのように定期バッチのような動作をさせるのは、
cronをつかって、Javaアプリとして作成するのが普通です。
回答3のようなやり方はお勧めしません。
クローラとサーブレットは別VMで動作させたほうが良いですし
個人的には、無限ループをするようなスレッドをかくのはどうかとは思います。
自前サーバでLinuxを想定してます。ディストリビューションはUbuntuかCentOSを想定してます。