S2JMS 開発記 WorkManager と CountDownLatch

S2JMS 開発記といいつつ,当分は S2JCA 開発記.
まずは「10. Work Management」から.


ここでの主要な存在は javax.resource.spi.work.WorkManager です.
これは java.util.concurrent.Executor と近い代物で,重めの処理をバックグラウンドのスレッドで実行してもらうためのもの.
話を JMS による非同期メッセージングに限定して書くと,メッセージを受信した JMS リソースアダプタはそれを javax.jms.MessageListener を実装したアプリケーションっていうか MDB に渡して処理してもらうのですが,その際にメッセージを受信したスレッドではなく,アプリケーションサーバが管理するスレッドで処理してもらうことが想定されているっぽい.
そのために使われるのが WorkManager
実際にはメッセージの処理以外のことでもなんでもありで,とにかくリソースアダプタは自前でスレッド起こしたりせずに,何かあったら WorkManager にお願いする次第.


んで,WorkManager にはこんなメソッドがあります.

  • doWork(Work work)
  • startWork(Work work)
  • scheduleWork(Work work)

WorkRunnable を拡張したもので,アプリケーションサーバが提供するスレッド上で実行する処理を表します.
それぞれのメソッドの複雑版もあるのですが,これらの違いは

doWork(Work)
別スレッドで Work の実行が終了した時点でリターンする.
startWork(Work)
別スレッドで Work の実行が開始された時点でリターンする.
scheduleWork(Work)
WorkManagerWork を受け付けた時点でリターンする.

となっています.
つまり,単純にスレッドプールに Work をキューイングして終わりじゃなくて,開始時点や終了時点で同期をとらないといけないわけですね.


こういうのって,自分で同期してもたいした手間ではないのですが,これまで J2SE1.4 前提だったために使う機会の無かった java.util.concurrent パッケージをチェックしてみたら,そのものズバリなクラスがありました.
java.util.concurrent.CountDownLatch です.


こいつは整数の値を持っていて,await() メソッドを呼び出すと整数値が 0 になるまでブロックします.
別のスレッドが countDown() メソッドを呼び出すと整数値が -1 され,0 になれば await() しているスレッドが起こされます.
なので,doWait(Work) では 2,startWork(Work) では 1,scheduleWork(Work) では 0 に設定した CountDownLatch を使って,Work の実行前後に countDown() を呼び出すようにすれば簡単に実装できそう (整数値が 0 の時に countDown() を呼び出しても問題なし).
昔 (Doug Lea の) はバイナリの Latch しかなかった気がするけど,こっちの方が強力ですね.
スレッドプールもいくつかの実装が用意されているし,便利そうだなぁ java.util.concurrent パッケージ.
Tiger を使う機会が無くてかなーり出遅れたけど,これらもうまく使えるようにならなきゃ.


とりあえず,正月休み中に「10. Work Management」を終わらせたい今日この頃であります.


出演予定 TV 番組

エビちゃんカレンダーの蛯原友里ちゃん

この近辺 (どこ?) で話題のモデルが出演するテレビ番組を分かるだけ掲載します.
新規分は赤字で (レギュラー除く).直近分は太字で.

山田優
01/03 (月) 21:00〜23:24 TBS 「里見八犬伝〜後編」
香里奈
01/04 (水) 18:30〜20:54 TBS 「さんま玉緒のあんたの夢をかなえたろかSP」


資生堂の広告

なんか,今日 昨日の朝刊に資生堂の広告が入っていたようですね.
こちらで雰囲気だけ分かるのですが...
http://www.shiseido.co.jp/corporate-ad/060101ad.htm
すごいですよ.
蛯原友里ちゃんはもちろん,相沢紗世ちゃん,鈴木えみ,元 Ray モデルの橋本麗香などなど.
もっと大きな画像で見たいなぁ.
っていうか,朝刊に入っていたという広告が欲しいよ!!!!

Jazz 98 - 94 Lakers

(ToT)
年明けの初戦も負けて,年をまたいで 4 連敗,勝率 5 割へ逆戻り.
無念だ.
Kobe が年末の試合でのラフプレーで 2 試合出場停止.
つまり次の試合もでられないわけで...
無念だ.