便利なコードパーツ集!

やまろうのプログラミングTips

Java

[Java] EJB Strategyパターン ~ トランザクション属性を選べるようにする

投稿日:2016年12月6日 更新日:

2003年

前回の続き、EJB Strategyパターンというデザインパターンを
思いついたやまろうでしたが、問題点が発覚しました。
その問題点とは、「トランザクションの制御が非常に粗くなる」
というものでした。これはこのパターンが
StrategyServerEJBのObject handle(Event event)
というメソッドを使いまわす為、指定できるトランザクションが
一つに限られるというものでした。
そこで、

1.リモートメソッドを全トランザクション属性分用意する。
2.EJBから処理を委譲されるEJBStrategyインターフェースにも
メソッドを全トランザクション属性分用意する。
3.EJBStrategyインターフェースのメソッド数が増えたため、
インターフェースを空実装したEJBStrategyAdapterを作成する。

ことにしました。さらに、
EJB呼び出しはlookupしたり、HomeからRemoteをcreateしたりと
面倒である為、J2EEパターン・EJBデザインパターンのBusiness Delegate
クラス(StrategyServerDelegate)を作成しました。

スポンサーリンク



* DelegateがSerializeされた時に復元する為にEJB Handleを保持しておく。
* EJBデザインパターンのサンプルに載っていた方法なのですが、
* うまく動きませんでした。なのでコメントアウトしてあります。

ejb-jar.xmlも以下のように変更しました。
[ejb-jar.xml]

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise[次行へ続く]
JavaBeans 2.0//EN' 'http://java.sun.com/dtd/ejb-jar_2_0.dtd'>

<ejb-jar>
<display-name>StrategyServer</display-name>
<enterprise-beans>
<session>
<ejb-name>StrategyServer</ejb-name>
<home>ejbstrategy.StrategyServerHome</home>
<remote>ejbstrategy.StrategyServer</remote>
<ejb-class>ejbstrategy.StrategyServerBean</ejb-class>
<session-type>Stateful</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>StrategyServer</ejb-name>
<method-name>handleRequired</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
<container-transaction>
<method>
<ejb-name>StrategyServer</ejb-name>
<method-name>handleRequiresNew</method-name>
</method>
<trans-attribute>RequiresNew</trans-attribute>
</container-transaction>
<container-transaction>
<method>
<ejb-name>StrategyServer</ejb-name>
<method-name>handleMandatory</method-name>
</method>
<trans-attribute>Mandatory</trans-attribute>
</container-transaction>
<container-transaction>
<method>
<ejb-name>StrategyServer</ejb-name>
<method-name>handleNotSupported</method-name>
</method>
<trans-attribute>NotSupported</trans-attribute>
</container-transaction>
<container-transaction>
<method>
<ejb-name>StrategyServer</ejb-name>
<method-name>handleSupports</method-name>
</method>
<trans-attribute>Supports</trans-attribute>
</container-transaction>
<container-transaction>
<method>
<ejb-name>StrategyServer</ejb-name>
<method-name>handleNever</method-name>
</method>
<trans-attribute>Never</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>

トランザクション属性をhandle〜メソッドに〜と同じ属性を
設定してあります。

これにより、
「全トランザクションを利用出来るようになった」
「EJB呼び出しがDelegateクラスに隠蔽されて呼び出しが簡単になった」
とのですが、EJBを使う側からこんなご意見が
「メソッド名がhandle〜だと解かりにくいから、もっと具体的な処理名をつけてよ」
「引数をいちいちEventオブジェクトに格納して送るの面倒くさいよ」
とのことです。

確かにhandle〜(Event)、和訳すると「Eventを処理する」だと何の処理をする
のか解りにくいですなぁ。それに引数がEventオブジェクトにしなければ
ならないというのも使いにくいし、コンパイラの型チェックが利かない
しなー。

でも、一つのEJBを使いまわすんだから、インターフェースが汎用的で大雑把な
ものになるのは宿命なんじゃないかぁ?

「キラーン☆いいこと思いついたー!!」

EJBは使いまわすから、大雑把なインターフェースなのは仕方ないから、
使う側からは厳密なインターフェースにすればいいわけだな!
つまりはクライアントとの間にもう一つクラスを挿めばいいわけです!

ということで次回はこの問題を解決します。
んじゃ
やまろう

スポンサーリンク

-Java

Copyright© やまろうのプログラミングTips , 2020 AllRights Reserved Powered by AFFINGER4.