JavaEE5(EJB3.0)でワーカスレッドのようなものを実現するにはどうすればよいでしょうか。



クライアント(Webブラウザ)から要求
->サーバが要求を受け取ってEJBコンテナのインスタンスを生成、メソッドを実行。
->(1)EJBコンテナのメソッドの中で処理中フラグをDBに永続化。
->(2)ワーカスレッドを起動し、クライアントに受け付けたことをレスポンスする。
->(3)ワーカスレッドの中で重い処理を実行し、完了すると完了フラグをDBに永続化。

みたいなことを行いたいのですが、
A.(2)のようにEJBコンテナの中でスレッドを起動することはできない?
B.(1)(3)のDB永続化はそれぞれ異なるスレッドが行うが、entity managerはスレッドセーフでないので無理?
というようなことがWebや書籍に書いてありました。

上記のような処理を実現するためには、通常どのような実装を行うのか、というのが知りたい内容になります。
(JavaEEの学習始めたてなので、何か大きな勘違いをしているのでしょうか…?)

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/08/22 18:40:18
  • 終了:2010/08/29 13:58:14

回答(2件)

id:yamaneroom No.1

yamaneroom回答回数1040ベストアンサー獲得回数612010/08/22 23:05:08

ワーカースレッドを作成することは可能だが、それとクライアントへのレスポンスは全く別問題。


また、ワーカースレッドは一般的にバックグラウンドジョブになるので、そこで重たい処理をさせるのは感心しない。

id:init_d

> ワーカースレッドを作成することは可能だが、それとクライアントへのレスポンスは全く別問題。

(1)(2)(3)を行わずにそのまま重たい処理を実行させるとその間クライアントへ応答が戻らないというイメージを持ってしまっていたのですが、そうではない、ということでしょうか。

> また、ワーカースレッドは一般的にバックグラウンドジョブになるので、そこで重たい処理をさせるのは感心しない。

ここでいうバックグラウンドジョブ、というのがどういったものを指しているのか理解できていないのですが、私が"ワーカスレッド"という単語で意図したものは、SwingでいうところのSwingWorkerみたいなもので、重たい処理をさせるためのスレッドです。

ちょうどいい例がありました。

http://itpro.nikkeibp.co.jp/article/COLUMN/20070413/268205/

こちらはJavaSEの解説ですが、ちょうどこんな感じで、EJBコンテナのメインスレッドで重い処理を行うとクライアントにレスポンスが返らないままになるのではないかなあ…と。

2010/08/23 02:50:35

質問者が未読の回答一覧

 回答者回答受取ベストアンサー回答時間
1 ask002 87 5 0 2010-08-24 10:47:35
  • id:init_d
    メッセージ駆動Bean(Message Driven Bean;MDB)というのがキーワードのような気がしているのですが、このアプローチは正しいのでしょうか…?
  • id:init_d
    EJBデザインパターンという書籍の中でMessage Facadeパターンというものが紹介されており、これが期待していた形に近いです。

    そこでは、やはりメッセージ駆動Beanを用いていましたので、こちらについて調べてみようと思います。

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

トラックバック

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

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

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