JCA 入門記 ライフサイクル管理 その 3

かつては EbiYuri デーだった金曜日ですが,ハニカミのエビちゃん出演シーンだけ繰り返し見てもあっという間なので,今日も入門記です.


5.3.4 Resource Adapter Shutdown Procedure
初期化の次はシャットダウンです.アプリケーションサーバが停止する時や,アンデプロイされる場合など.
そんな場合には (どんな場合には?),アプリケーションサーバはリソースアダプタをシャットダウンするために 2 つの手順を踏まなくてはならないそうです.


5.3.4.1 Phase One
まずは最初のフェーズ.
アプリケーションサーバResourceAdapterstop() メソッドを呼び出す (これが 2 番目のフェーズらしい)前にそのリソースアダプタを使用しているアプリケーションを止めなくてはならないそうです.そりゃそうだ.
その中にはメッセージを受信するエンドポイント (MDB みたいな) も含むとか.
でもでも,アプリケーションを止めるには,通常はそれがアンデプロイされなきゃいけないっぽい.勝手に止めちゃいかんということでしょう.
そんな場合には (どんな場合には?),アプリケーションがアンデプロイされるまでリソースアダプタの停止を遅らせてもいいそうです.


そんなわけで (どんなわけで?),この最初のフェーズが終了した暁には,アプリケーションのスレッドからこのリソースアダプタへの参照が残っていてはいけないそうです.
でもでも,ヒープ上にあるオブジェクトはリソースアダプタへの参照を持ったままでも構わないとか.なんか微妙.ガベコレされるまで待たなくてもいいという意味か?
ともあれ (JW),トランザクションも含めてアプリケーションが活動していてはならん,とういことらしい.


5.3.4.2 Phase Two
そんなわけで (どんなわけで?),第 2 のフェーズ.
アプリケーションサーバResourceAdapterstop() メソッドを呼び出すことで,リソースアダプタを安全にアンロードできるように通知します.
なのですが,それは graceful なんだそうです.graceful... 優雅・上品・しとやか・優美... をぃをぃ.
ともあれ (JW),ResourceAdapter#stop() が呼び出されるわけですが,それはアプリケーションサーバのスレッドコンテキストが使われるとのこと.
そんなわけで (どんなわけで?),リソースアダプタは stop() が呼び出されるとコネクションをクローズしたりスレッドを解放したり,キャッシュしてるものがあればフラッシュしたりしないといけないらしい.


でもでも,リソースアダプタは急には止まれないというわけで (?),そんな場合には unchecked な例外を投げつければいいとのこと.そうしたらアプリケーションサーバとしてはログるくらいしかやりようがない気もしますがそういうことらしい.
将来の仕様では,リソースアダプタを強制終了するためのメソッドが追加されるかもしれないそうです.お? その強制終了メソッドに比べると,現在の stop() はお上品ということになるっぽい.(^^;


5.3.5 Requirements
アプリケーションサーバは,ResourceAdapter の実装クラスを再利用することは出来ません.リソースアダプタを初期化する際には新しいインスタンスを生成し,stop() を呼び出した後は破棄しないといけないということです.
また,アプリケーションサーバはリソースアダプタのメソッドや付随したオブジェクトを使用する前に ResourceAdapter#start(BootstrapContext) を呼び出さなくてはなりません.
ResourceAdapterstart(BootstrapContext)stop()アプリケーションサーバのスレッド上で呼び出されますが,そのセキュリティレベルはリソースアダプタのインスタンスと同等以上でなければならないとのことです.
でもって,ライフサイクルを示すステート図が掲載されています.


5.3.6 Resource Adapter Implementation Guidelines
ResourceAdapterインスタンスは,リソースアダプタの情報を管理するレジストリとして扱われるべきだそうです.そして,ResourceAdapterインスタンスはリソースアダプタのあらゆる状態にアクセスできるべきだとか.
そんなわけで (どんなわけで?),ManagedConnectionFactoryActivationSpec などのインスタンスResourceAdapterインスタンスに登録するのがよいらしい.
さらに,リソースアダプタは ResourceAdapter の状態を把握するためのスレッドを持つべきだそうです.それにより,ブロックしたままのスレッドをどうにかしたり,シャットダウン時のデッドロックを防ごうということらしい.


そんなわけで (どんなわけで?),今日はここまで♪