Seasar2.4でSMART deployを試す
前回の続きです。
Seasar2.4は実際の業務で使ったことはなく、あまりよくわからないままにしていたんですが、S2のJTAの実装が気になって見始めたのを機会に2.4からの基本的な機能をちょっと調べてみました。
前回のSeasar2.3での自動登録機能がさらに進化したのがSMART deployと言われているもののようです。なんかSMART deployってサーバの再起動なしで変更が反映されることそれ自体のことを指しているのかと思っていたのだけれどその機能はSMART deployの中でもHotDeployモードと言われてるモードで実現できる機能を指しているようですね。SMART deployは、まぁ、そのままズバリ「賢く」デプロイしてくれるってこと?
つまり2.3までの自動登録では、コンポーネントとAspectを自動で登録するには、自分で、このパッケージ内のすべてのクラスは自動で登録するとか、このパッケージのこんな感じの(*.Impl)名前のクラスは自動で登録するとか、しないとかって設定してた(前回のSampleTransaction.dicon)わけですけれども、2.4では、推奨パッケージ構成があらかじめ用意されていて、それに従えば、自身で規約を設定する必要もなく、コンポーネントの自動登録をしてくれるみたい。
早速前回のサンプルで実験してみます。
まず、2.4では、なんだかdiconファイルが増えています。sa-struts-tutorialからその辺のdiconは持ってきてみました。あとj2ee.diconがないと思ったら、jarのなかに入ってるもよう。じゃDBの設定とかはどこ行ったかっていうとjdbc.diconと言うファイルを使用するようです。jarのなかのj2ee.diconにはS2TXの設定だけ記述されているようで、DatasourceやらConnectionPoolの設定はこっちのjdbc.diconに記述することになってるみたい。
SMART Deployに関係してくるのはConvention,Creator,Customizerの各diconファイルらしいので、それらを設定してゆく。
まずは、Convention.dicon
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <component class="org.seasar.framework.convention.impl.NamingConventionImpl"> <initMethod name="addRootPackageName"> <arg>"sample.transaction"</arg> </initMethod> </component> </components>
ここでは、ルートパッケージを指定している。上の画像にもあるsample.transactionパッケージがここではルートのパッケージとして登録される。
次に、Creator.dicon
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <include path="convention.dicon"/> <include path="customizer.dicon"/> <component class="sample.transaction.creator.BusinessCreator"/> <component class="org.seasar.framework.container.creator.DaoCreator"/> <component class="org.seasar.framework.container.creator.ServiceCreator"/> </components>
ここでは、規約に沿った形で、自動登録をやってくれちゃうCreatorというコンポーネントを設定している。Creatorは規約にのっとった形でコンポーネント定義を作成してくれるコンポーネントで、推奨パッケージ設定に基づく形で、デフォルトで提供されるCreatorがいくつか存在しています。
この例では、2つ目と3つ目のコンポーネントはSeasarが提供してくれているもので、この場合だと2つ目のコンポーネントはsample.transaction.Daoパッケージに含まれるクラスを自動的にコンポーネントとして登録してくれる。 3つ目のも同様にsample.transaction.Serviceパッケージに含まれるクラスを自動的にコンポーネントとして登録してくれる。
詳しくはこちら。
ここで、1つ目のコンポーネントはなんだってことなんですが、前回のサンプルではsample.transaction.businessにビジネスロジックのインタフェースを、そしてsample.transaction.business.implにその実装を入れ、さらにそこにaspectの自動登録でj2ee.requiredTXのインターセプタを設定していました。
今回2.4を試してみるにあたり。もとからあるものを使ってその機能を実装しようとしても、sample.transaction.businessに対応するCreatorはデフォルトでは提供されていないため自身で作成する必要があります。ま、Serviceパッケージって名前変えて、クラス名もsuffixをServiceにすれば問題なく動いたんですが、せっかくなんで自分でCreatorを作って動かしてみました。
上の画像では、serviceパッケージにbusinessパッケージと同内容のものをファイル名を変えてコピーして、試してみています。ちゃんとできました。
package sample.transaction.creator; import org.seasar.framework.container.ComponentCustomizer; import org.seasar.framework.container.creator.ComponentCreatorImpl; import org.seasar.framework.container.deployer.InstanceDefFactory; import org.seasar.framework.convention.NamingConvention; public class BusinessCreator extends ComponentCreatorImpl { public BusinessCreator(NamingConvention namingConvention) { super(namingConvention); setNameSuffix("Business"); setInstanceDef(InstanceDefFactory.PROTOTYPE); //setEnableInterface(true); setEnableInterface(false); setEnableAbstract(true); } public ComponentCustomizer getServiceCustomizer() { return getCustomizer(); } public void setBusinessCustomizer(ComponentCustomizer customizer) { setCustomizer(customizer); } }
ServiceCreatorを真似てこんな感じで作成します。
次に、Customizer.dicon
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <include path="default-customizer.dicon"/> <component name="txAttributeCustomizer" class="org.seasar.framework.container.customizer.TxAttributeCustomizer"/> <component name="serviceCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain"> <initMethod name="addCustomizer"> <arg>txAttributeCustomizer</arg> </initMethod> </component> <component name="businessCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain"> <initMethod name="addCustomizer"> <arg>txAttributeCustomizer</arg> </initMethod> </component> </components>
ここでは、前回のサンプルで言うところのAspectの自動登録を行っています。Customizerというのは、コンポーネントをカスタマイズしてくれるコンポーネントです。Aspectを設定するなどしてコンポーネントをカスタマイズします。
ここでincludeされているdefault-customizer.diconには、SMART deploy によってはじめから提供されているCreatorへのCustomizerが設定されているのですが、そのままでは何の機能も設定されていません。よって、アプリケーション開発者が、customizer.diconで定義を上書きしたり、自身で追加したCreatorに対しては新規にCustomizerを設定する必要があるのです。
BusinessCreatorでは、
public void setBusinessCustomizer(ComponentCustomizer customizer) { setCustomizer(customizer); } }
で、businessCustomizerコンポーネントをDIしています。そんで、コンポーネント定義作成の際に、txAttributeCustomizerによるカスタマイズが行われることとなるのかな?まだ、ちゃんと見てないんだけれど。
あと、余談なのですが、このtxAttributeCustomizerって、sa-struts-tutorialで設定されていたので、使ってみたんだけれど、なんかはじめのうち、そんなのコンポーネントないって言われて落ちて困っていました、これはs2-tigerのjarの方に存在するようで、この中にちゃんと入ってました。
ちなみにTxAttributeCustomizerは、defaultでは、前回のrequiredTXと同じ動きをするようです。
その他のdiconファイル
app.dicon
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <include path="j2ee.dicon"/> </components>
s2container.dicon
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <include condition="#ENV == 'ut'" path="warmdeploy.dicon"/> <include condition="#ENV == 'ct'" path="hotdeploy.dicon"/> <include condition="#ENV != 'ut' and #ENV != 'ct'" path="cooldeploy.dicon"/> </components>
このファイルはクラスパス上のテキストファイルenv.txtをみてそのファイルの記述に沿って、SMART deployのモードを設定します。この辺
推奨パッケージに沿ってアプリケーションを作っていけば、コンポーネントが自動で登録されるし、Aspect的なものもCustomizerを使っ自動的に設定することができるようになっているといったものが、SMART Deployと呼ばれているものらしいって認識です。間違ってたらごめんなさい。