- PR -

Servletの乱れ撃ち

投稿者投稿内容
トリックスター
大ベテラン
会議室デビュー日: 2003/04/16
投稿数: 104
投稿日時: 2003-04-16 21:58
はじめまして。どうぞよろしく。
いきなり質問で申し訳ないのですが...

12個のフォームがあります。訳あって1個のフォームに
できません。
この12個のフォームを同じServletにsubmitします。
この場合、別スレッドで12個のServletが起動しますが
ブラウザはこの中の不特定の1個をレスポンスとして
表示します。
と、ここまではOKなのですが、
12個のServletは、ちょっと重い処理を行っていて、
その全てが終わったことをそのServlet内で検知して
次の処理に移りたいのです。で、その次の処理に進む
Servletは12個の中で1個だけにしたいのです。

・教えていただきたいこと1
 複数のServlet間で互いに処理の完了を検知する方法

・教えていただきたいこと2
 最初に検知したServletのみある処理を実行する方法

よろしくお願いいたします。
まりり
ぬし
会議室デビュー日: 2001/12/05
投稿数: 329
投稿日時: 2003-04-17 01:20
正直、どういう作りになっているのか想像がつかないのですが。

12個のフォームというのは1つのHTML(あるいはJSPなど)にある別々のHTMLフォームで
1度のsubmit操作で12個のフォームをすべてsubmitするということですか?
そうなったときに、12個回分のsubmitで処理されているServletで連携をとりたいと
いうことでしょうか?

どうも違う気がするんですけれども・・・

複数の処理で連携をとりたいのなら関連のあるsubmitを識別できるような情報を
キーにしたRDB上のテーブルでも作ってステータスや順番の管理をしてください。
(テーブルである必要はありませんが、Servletとは別の仕組みで実現したほうがよいかと)

でも、よく分らないですけど設計ってほんとにそれでいいんです?
tommy
会議室デビュー日: 2003/03/11
投稿数: 15
投稿日時: 2003-04-17 02:25
引用:

ゼロさんの書き込み (2003-04-16 21:58) より:
この12個のフォームを同じServletにsubmitします。
この場合、別スレッドで12個のServletが起動しますが
ブラウザはこの中の不特定の1個をレスポンスとして
表示します。
と、ここまではOKなのですが、



OK ということは、1回の submit で複数のリクエストを
送出できているのでしょうか?
HTTP の性質上、そんなことができるのでしたっけ。

レスポンスが戻されるまえに別のフォームの submit を
(ボタン押下して)おこなえているのではないのですよね?

# 仮にそうならば、最後のリクエスト以外レスポンス
# が戻されていないということになります


引用:

ゼロさんの書き込み (2003-04-16 21:58) より:
12個のフォームがあります。訳あって1個のフォームに
できません。



この『訳あって』の訳しだいでは別な解もありうると
思います。
未記入
ぬし
会議室デビュー日: 2002/03/28
投稿数: 255
投稿日時: 2003-04-17 12:24
>この12個のフォームを同じServletにsubmitします。
>この場合、別スレッドで12個のServletが起動しますが

「12個のスレッドで一個のServletインスタンスを共有する」
の間違いじゃないでしょうか?

同期に関してはJavaでやってもいいし,RDBMS側で
やってもいいわけで,様々な方法があると思います.
トリックスター
大ベテラン
会議室デビュー日: 2003/04/16
投稿数: 104
投稿日時: 2003-04-17 14:12
まりり様

>正直、どういう作りになっているのか想像がつかないのですが。

ですよねぇ。

>12個のフォームというのは1つのHTML(あるいはJSPなど)にある別々のHTMLフォームで
>1度のsubmit操作で12個のフォームをすべてsubmitするということですか?
>そうなったときに、12個回分のsubmitで処理されているServletで連携をとりたいと
>いうことでしょうか?

そのとおりです。

>どうも違う気がするんですけれども・・・
>
>複数の処理で連携をとりたいのなら関連のあるsubmitを識別できるような情報を
>キーにしたRDB上のテーブルでも作ってステータスや順番の管理をしてください。
>(テーブルである必要はありませんが、Servletとは別の仕組みで実現したほうがよいかと)

この場合、RDBを監視するのは、誰になるのでしょうか?
・12個のServletでしょうか。
・12個のServletから共有の監視インスタンスをたてるということでしょうか。

>でも、よく分らないですけど設計ってほんとにそれでいいんです?

それは、微妙です。
お手数で申し訳ありませんが、他の方への返答も見ていただいて
判断していただけると幸せです。

−−−−
tommy様

>OK ということは、1回の submit で複数のリクエストを
>送出できているのでしょうか?
>HTTP の性質上、そんなことができるのでしたっけ。
>
>レスポンスが戻されるまえに別のフォームの submit を
>(ボタン押下して)おこなえているのではないのですよね?

1回の操作(具体的にはリンクをクリック)で、
複数回 submitする(JavaScriptで)という意味です。
12個のServletが起動し処理を行っていることは確認
していますが、同期をとりたいという質問です。

># 仮にそうならば、最後のリクエスト以外レスポンス
># が戻されていないということになります

ご指摘どおりです。気持ち悪いですが、要件としては、
それで問題ありません。
12個のServletは、皆同じもの(1つのインスタンス)な
のでレスポンスも同等です。同期さえとれれば、12個の
結果を記すレスポンスはどれであっても問題ないという
認識です。

>この『訳あって』の訳しだいでは別な解もありうると
>思います。

Servletの機能は具体的にはファイルのアップロードです。
12個のフォームは全て同じコンテンツ(Element)と考え
てください。値(ファイル名)は、それぞれ違います。
12個のフォームを1つにするという案もありました。
しかし要件として、
・1コンテンツ単位のsubmit
・全てのコンテンツのsubmit
があります。
1コンテンツ単位のsubmitをしたいのに、全てのコンテン
ツが送信されるのは、避けたいと考えております。

−−−−
悪夢を統べるもの様

>>この12個のフォームを同じServletにsubmitします。
>>この場合、別スレッドで12個のServletが起動しますが
>
>「12個のスレッドで一個のServletインスタンスを共有する」
>の間違いじゃないでしょうか?

ご指摘、ありがとうございます。

>同期に関してはJavaでやってもいいし,RDBMS側で
>やってもいいわけで,様々な方法があると思います.

様々な方法から、最適な方法を選びたいので、教えて
いただけないでしょうか。

現在
・RDBMSで管理
・sessionで管理
が候補としてあります。
他にはどのような方法があるでしょうか。
smym
会議室デビュー日: 2003/04/15
投稿数: 5
投稿日時: 2003-04-17 14:56
はじめまして。

 ちょっと思いついたことがありますのですが、なにぶん初学者な者でして、全然検討ハズレ
の内容でしたら、無視してしまってください^^;

 以前サーブレットの初心者がよくハマる落とし穴にはまったことがあります。
 サーブレットがマルチスレッドで動いていることをよく理解しておらず、サーブレット
クラスの中でインスタンス変数を普通のクラスのように利用していたら、 スレッド同士
で上書きしまくり、全く予期しない動作させてしまいました。
 これを逆手に取れば、 インスタンス変数をカウンタとして使って、単純に1を足し込む
命令を書いておけば、 実行時にカウンタが12になれば「自分は最後に実行されたんだな
」ぐらいなら捕らえられるのではないでしょうか??



トリックスター
大ベテラン
会議室デビュー日: 2003/04/16
投稿数: 104
投稿日時: 2003-04-17 22:43
smym様

> サーブレットがマルチスレッドで動いていることをよく理解しておらず、サーブレット
>クラスの中でインスタンス変数を普通のクラスのように利用していたら、 スレッド同士
>で上書きしまくり、全く予期しない動作させてしまいました。
> これを逆手に取れば、 インスタンス変数をカウンタとして使って、単純に1を足し込む
>命令を書いておけば、 実行時にカウンタが12になれば「自分は最後に実行されたんだな
>」ぐらいなら捕らえられるのではないでしょうか??

解決はしていませんが、よいヒントになりました。
ただし、複数のsessionから同時に実行された場合を考慮して
session管理が必要ですね。
有益な情報をありがとうございました。
tommy
会議室デビュー日: 2003/03/11
投稿数: 15
投稿日時: 2003-04-17 23:21
引用:

smymさんの書き込み (2003-04-17 14:56) より:
 サーブレットがマルチスレッドで動いていることをよく理解しておらず、サーブレット
クラスの中でインスタンス変数を普通のクラスのように利用していたら、 スレッド同士
で上書きしまくり、全く予期しない動作させてしまいました。
 これを逆手に取れば、 インスタンス変数をカウンタとして使って、単純に1を足し込む
命令を書いておけば、 実行時にカウンタが12になれば「自分は最後に実行されたんだな
」ぐらいなら捕らえられるのではないでしょうか??


これはうまくいかない可能性があります。
まず、インスタンス変数を利用するスレッドが同一クライアントからの
リクエストで起動されたスレッドのみであることを保証するすべが
ありません。
※リクエストが別インスタンスのスレッドにアサインされることも考慮したい

そこで、セッションに紐付ければ...となるかと思いますが、
複数スレッドから共有される変数にアクセスするわけなので、
きちんと排他制御してやらないと計算結果が保証されません。

同期や排他制御についてもう少し調べてみてはいかがでしょうか?
悪夢を統べるもの さんも書いているとおり、JavaでもRDBでも実現できます。

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