目次
背景EJBの中の処理を並列化したいので、何か使えるネタが無いかなと探してみた。J2EE1.4という条件付けだと、
と3択になった。 terminology面倒なので、英文字省略ものはここに。よく使われてるものから、このぺーじ編集のためだけに 何度も出てくるから・・ってんで書いてるのもあります。
各選択肢のいいところ・わるいところ選択肢その1 MDB
選択肢その2 JCAの場合
選択肢その3 commonjの場合
作りたいものの雰囲気はこんな感じです。[ejb] | +--+--+--- 並列化するしくみ | | | Threadみたいな感じ? EJBとThreadJCAはRA(Resouce Adapter)を作る場合の仕様であり、この中のWM(Work Managment)とLM(Lifecycle Managment)に対応する pkg javax.recouce.spi.workが、J2EE1.4 APIの中でThreadを利用することを前提としている。なお、J2EE1.4の仕様に含まれるEJB2.1においては、enterprise beanはThreadのi/f各種(start,stop,suspend, resumeとか 優先度、名前の変更)、ThreadGroup?の操作してはならない(must not)と記載されている。 Enterprise JavaBeans? 2.1, Final Release Chapter 25 Runtime Environement 25.1.2 Programing Restrictions (page 563)より抜粋 ・The enterprise bean must not attempt to manage threads. The enterprise bean must not attempt to start, stop, suspend or resume a thread, or to change a thread's priority or name. The enter- prise bean must not attempt to manage thread group. Thease functions are reserve for the EJB container. Allowing the enterprise bean to manage threads would decrease to conainter's ability to properly manage the runtime environment. そういうことなので、上記の「Threadみたいな感じ」のところをホントに Threadでやっちゃった場合、EJBコンテナにおけるデータ不整合に起因する Exceptionや異常動作があっても知ったこっちゃ無いということになります・・よ?
実装とか選択肢その1 MDBJ2EE 1.4 Samples Bundleのejb/mdbにあるSimpleMessageBean?.javaが、上図のThreadみたいな感じのところになり、 並列化する仕組みはJMS(=Message Queue)です。選択肢その2 JCAの場合後述w選択肢その3 commonjの場合まぁ、この辺でも ;-)
Resource Adapterをつくろう(for 選択肢その2)ということで、仕方ないwので、RA(Resource Adapter)を作ってみる。読めば読むほど、並列化のためにRAなんてあり得ないと思えてくるが、まぁ、気にしない。;-) RAって?RAはASにpluginできるシステムレベルのs/w driverで、(AS上の)Java applicationによって、 EISに接続する際に使われる。こんな感じかな。
EISとの連携の仕方によって、RAは2種類に分類される。
JCA1.0に対するJCA1.5の拡張JCA1.0ではEISとの接続を実現する上で、CM(connection managment),TM(transaction management)の管理とsecurity、 CCI、deployとpkg構成に関してが記されている。JCA1.5ではこれに加えて、
が入っている。JCA1.0の仕様書が188ページなのに対して、JCA1.5は490ページとだいぶ増えてる。 RAに求められる機能SPECにはRA、ASのそれぞれに求める要求が記載されているが、ここはRAのためだけなので、 RAに求められる機能を作る上で必要な範囲でまとめてみる。今回はoutbound RAで、且つ WMを使いたい。まず、JCA1.5の仕様書にあるoutbound RAの実装する機能一覧はこんな感じ。JCA1.5 16.2節 TABLE16-1 Resource Adapter API Requirements より抜粋
ということなので、outboound RAで、実装範囲はLM,WM,CM,TM,SMにすることが確定。 前置き各機能の前提になる項目をまとめとく。JCA1.5SPECから抜いているのはResourceAdapter?の実装者向け 情報に限定している。JavaBean?RAが実装すべきinterfaceの実装クラスの要件として、JavaBean?であることと言う記載がある。これは JavaBeans?の仕様書(1.01 Final Release on page F-2)を見ろと JCA1.5仕様書 16.3 JavaBean? Requirements節に書いてある。 要は普通のJavaBean?にしろということで、下記2条件を満たす必要がある。
また J2SE1.4からは marker interfaceとして java.io.Serializableをimplementsする必要は無くなっている。 Lifecycle managment実装する上での注意点は下記の通り。ResouceAdapter?実装クラスのメソッドとか(5.3.1節に対応)
ManagedConnectionFactory?(5.3.2節に対応)ManagedConnectionFactory?はResourceAdapter?とResourceAdapterAssociation?インターフェースを通じて、 関連性を持つ。特にResourceAdapter?のsetter(setResourceAdapter())はManagedConnectionFactory?インスタンスの ライフサイクル中で1度以上呼ばれてはならない。ActivationSpec?(5.3.3節に対応)省略。IMやらないし。ResrouceAdapter?の停止RAの停止は
の2パターンがある。停止は2phaseに分かれていて、phase1はResourceAdapter?.stop()
をASが呼ぶ前に責任もって、RAと独立に使われているリソースの停止処理をしれというところ。
つまり、RA実装者には関係ない。ph2はstop()が呼ばれるところなので、
ResouceAdapter?.stop()の実装で何をする必要があるかになる。
Work managmentConnection managementTransaction managementSecurity management |