人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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


●質問者: rapuntuleru
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:アクセス クラス クローラ サーバ サーブレット
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● Km1967
●23ポイント

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

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

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

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


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

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

◎質問者からの返答

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


2 ● Km1967
●23ポイント

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の設定を行うのであれば設定の保存先以外は特に違いはない。

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


3 ● pyopyopyo
●22ポイント

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の書籍等で調べてみてください。たぶんパフォーマンスチューニングの章に載ってます。


4 ● ko8820
●22ポイント

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

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ