- ベストアンサー
ひとつのインターフェースで複数のEJBクラスを参照する方法
- EJBを使った開発を行っている際に、複数のEJBクラスをひとつのインターフェースで参照する方法について知りたいです。
- 現在はRemoteインターフェース、Homeインターフェース、EJBクラス1を1対にしているのですが、Remoteインターフェース1、Homeインターフェース1、EJBクラス1のような1対Nの関係で呼び出しを行いたいです。
- 可能なのかどうか、もしくはその他の方法があるのかを教えていただけると助かります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
おそらく、EJBの継承を考えた呼び出しということなんだと思います。 実際に簡単なEJBを作成し、JBoss上でEJBを実行してみたところ、 可能でした。 メインのEJBクラス(デプロイメントディスクリプタに指定EJBクラス) public class MultipleBean implements SessionBean { protected MultipleBean beanObj; public void message() throws RemoteException { beanObj.message(); } public void ejbCreate(String implementors) throws RemoteException { try { beanObj = (MultipleBean)Class.forName(implementors).newInstance(); } catch (Throwable ex) { throw new RemoteException(); } } ---- EJBクラス1 ---- public class MultipleBean1 extends MultipleBean { public void message() { System.out.println( "MultipleBean1 Call" ); } } ---- EJBクラス2 ---- public class MultipleBean2 extends MultipleBean { public void message() { System.out.println( "MultipleBean2 Call" ); } } これで、EJBクライアント(確認では単純なJavaクラスですやりましたが)で Homeインタフェースを使ってcreateするときに、引数でクラス名を指定して やると、確かにそれぞれのEJBを呼ぶことはできました。。。 ただし、あくまでも呼び出せるかどうかを検証したレベルであり、EJBクラス(業務ロジック)が 複雑だったり、複数クライアントからの要求はもちろん、いろんな状況で正しく動くかどうかは 確認していませんので、もし実際にこのようなコードを記述するなら、もっと考慮が必要だと思いますが、、、 EJBコンテナがEJBクライアントからEJBクラスにアクセスするための方法としてRemote インタフェースとHomeインタフェースを提供するという前提を考えると、どうも小手先だけの 間違った実装のような気もしますね。。。 本当なら、やはり1対1で対応するようにRemoteインタフェースとHomeインタフェースを定義すべきなんだと思いますが。。。
その他の回答 (1)
> 子サーブレットは親サーブレットにどのBaenのインスタンス化を行うか > メッセージを送り、親サーブレットはそのメッセージを受け取りHome、 > Remoteインタフェースの作成を行い、子サーブレットは単純に > 呼び出すだけにしたかったのです。 すみません。 どうも、大きな勘違いをしていたようです。 ↓に示されたようなシステムにおいて、子サーブレットからのメッセージに 合わせて親サーブレット内でEJBにアクセスするというのであれば、単純に デプロイメント・ディスクリプタ内で同一のRemote、Homeインタフェースを 持つ別のEJBを定義してやればよい話ですね。。。 ejb-jar.xml で <ejb-name>beanmultiple1</ejb-name> <home>beanMultiple.BeanMultipleHome</home> <remote>beanMultiple.BeanMultiple</remote> <ejb-class>beanMultiple.BeanMultipleBean</ejb-class> : <ejb-name>beanmultiple2</ejb-name> <home>beanMultiple.BeanMultipleHome</home> <remote>beanMultiple.BeanMultiple</remote> <ejb-class>beanMultiple.BeanMultipleBean2</ejb-class> : という感じで、同一のインタフェースを持つ2つのEJBを定義し、別々の 名前でJNDIに登録しておいて、例えば子サーブレットからメッセージとして JNDI名をもらって親サーブレットでもらったJNDI名を使ってEJBを呼び出す という方法をとればいいのではないでしょうか? これだと、EJBクラスに1対1に対応するHomeインタフェースと Remoteインタフェースが存在することになり、EJBの設計上、問題 ないように思います。
お礼
何度もお返事をいただいて誠にありがとうございます。 この方法でもう一度設計をよく見直して行きます。 後、ポイントをつけるのを忘れてしまい申し訳ありませんでした。
お礼
spoonyさんお返事ありがとうございました。 その後色々と考えたり、周りの人に相談したりしたのですが、 確かにspoonyさんのご指摘にもあったように ↓の構成のように1対1の関係の設計の方が いいような気がします。 |-------------Home-------- | | クライアント--| Bean | | |-------------Remote----- 下手に継承などをつかわずに単純にしたほうが確かに見やすいと思います。 そもそもなぜこのようなことをしたかったのかというとEJBの呼び出しを 共通化させたかったのです。現在↓のようなシステムの構成を考えています。 親サーブレット-------------| | | |----子サーブレット1-------EJB1 | | | |----子サーブレット2-------EJB2 | | | |----子サーブレット3-------EJB3 | | | |----子サーブレットN-------EJBN 親サーブレットは子サーブレットの共通する処理を定義し、 子サーブレットはその機能独自の処理のみを実行するようにして、 共通化された部分は単純に親から呼び出すといった形にしたかったのです。 そしてその共通化させるという中にインタフェースの呼び出しがありその呼び出しを 共通化させるため1つのHome、Remoteインタフェースで複数の Beanのインスタンス化を行いたかったのです。 子サーブレットは親サーブレットにどのBaenのインスタンス化を行うか メッセージを送り、親サーブレットはそのメッセージを受け取りHome、 Remoteインタフェースの作成を行い、子サーブレットは単純に 呼び出すだけにしたかったのです。