- PR -

サーブレットの中での非同期処理の実現方法

1
投稿者投稿内容
Tol
常連さん
会議室デビュー日: 2004/07/16
投稿数: 27
投稿日時: 2006-03-09 00:39
Tomcat上で動作しているサーブレットの中で、非同期に別処理を行いと思っています。
具体的には以下の手順です。

1.リクエストを受け取る(サーブレットの起動)
2.非同期にて別の処理を行う。(別の処理=メソッドを呼ぶ)
3.リクエストに対しては、すぐに適当なレスポンスを返す。

2,3は並列に動作ということになると考えています。
そこでなのですが、2の非同期で別の処理を行うにはどうすればよいかがわかりません。
普通に考えると、スレッドを起動させてやればいいと思うのですが、Tomcatのサーブレット上で、勝手にスレッドを作成するのはよくないのではと思っています。
さらに、TomcatのためJMSも使えないので困っています。

何か他に方法を知っていましたら、ぜひ教えてください。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-03-09 00:52
別にスレッドを作成するのは問題ありませんよ。
JMSはTomcatからでもJNDI経由で使用できると思いますが。(試したことないですが)
Tol
常連さん
会議室デビュー日: 2004/07/16
投稿数: 27
投稿日時: 2006-03-09 01:13
返信ありがとうございます。

TOMCATでもJMSが使用できるとは知りませんでした。勉強してみます。
スレッドの作成は問題ないとのことですが、はじめは、以下のように考えて
好ましくないかと考えました。(正しいかどうかは別として)

1.サーブレット自身を含め、Tomcat上で動くスレッドはTomcatが一括で管理している。
2.勝手にスレッドを作成するとTomcatが管理できなくなる。
3.スレッド数の許容値を越えるなどして、TOMCATが落ちる。

と、考え好ましくないかと考えたのですが、問題はないのでしょうか?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-03-09 01:49
引用:

1.サーブレット自身を含め、Tomcat上で動くスレッドはTomcatが一括で管理している。
2.勝手にスレッドを作成するとTomcatが管理できなくなる。


サーブレット関連のスレッドは管理していますが、
誰が作ったかわからないスレッドまで管理しません。

引用:

3.スレッド数の許容値を越えるなどして、TOMCATが落ちる。


数千とかスレッドを作る予定でしょうか?
落ちるほど作成するのは単なる設計ミスです。
スレッドを使い捨てるのではなく、ワーカースレッドとスレッドプールを
使うようにすれば問題ないでしょう。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-03-09 02:52
>TOMCATでもJMSが使用できるとは知りませんでした。勉強してみます。
JMS(というかこの場合具体的には MDB ?)は Tomcat 自体には含まれません。
外部のアプリケーションサーバなどにメッセージを投げることは可能です。
Tol
常連さん
会議室デビュー日: 2004/07/16
投稿数: 27
投稿日時: 2006-03-09 22:06
引用:

数千とかスレッドを作る予定でしょうか?
落ちるほど作成するのは単なる設計ミスです。
スレッドを使い捨てるのではなく、ワーカースレッドとスレッドプールを
使うようにすれば問題ないでしょう。



スレッド数については、ワーカースレッド、スレッドプールを検討してみたいと思います。
ただ、今回、1スレッドでかなり多くのメモリが必要になる可能性があります。
スレッドの場合はメモリは共有すると思うので、1スレッドで多くのメモリを使うとなると、
少ないスレッド数でも、結果的にメモリがたりなくなりTomcatが不安定になるということはないでしょうか?
今回心配なのは、Tomcatが別スレッドの影響を受けて落ちてしまうことです。
自分で勝手に起動したスレッドが落ちるのは許せるのですが、
Tomcatまで一緒に落ちてしまうことは絶対に防ぎたいと思っています。

この場合でも、サーブレットの中で勝手にスレッドを立ち上げても問題ないのでしょうか?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-03-09 22:59
引用:

ただ、今回、1スレッドでかなり多くのメモリが必要になる可能性があります。
スレッドの場合はメモリは共有すると思うので、1スレッドで多くのメモリを使うとなると、
少ないスレッド数でも、結果的にメモリがたりなくなりTomcatが不安定になるということはないでしょうか?


それは別にスレッドを作らなくても、メモリが足りなくなれば落ちる可能性はあります。
スレッドに限った話ではないですね。

Tomcatだろうと通常のアプリであろうと、
javaコマンドからmainメソッドを経由して起動されます。
メモリが足りなくなってOutOfMemoryErrorが発生するのはどのプログラムも同じです。
省メモリで動くように設計するか、起動オプションの調整を行って
ヒープ領域などを増やすしかないです。
1

スキルアップ/キャリアアップ(JOB@IT)