
はじめまして、MAKOTOと申します。
EJBを使った開発を行っているのですが、
サーブレットからEJBクラスを呼ぶとき
現在はRemoteインターフェイス、Homeインターフェース、EJBクラス1を1対
にしているのを
Remoteインターフェイス1
Homeインターフェース1
EJBクラス1
Remoteインターフェイス2
Homeインターフェース2
EJBクラス2
↓のように1対Nの関係で呼び出しを行いたい
Remoteインターフェイス
Homeインターフェース
EJBクラス1
EJBクラス2
EJBクラス3
EJBクラス4
EJBクラス5
このようなことは可能なのでしょうか?
No.1ベストアンサー
- 回答日時:
おそらく、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インタフェースを定義すべきなんだと思いますが。。。
spoonyさんお返事ありがとうございました。
その後色々と考えたり、周りの人に相談したりしたのですが、
確かにspoonyさんのご指摘にもあったように
↓の構成のように1対1の関係の設計の方が
いいような気がします。
|-------------Home--------
| |
クライアント--| Bean
| |
|-------------Remote-----
下手に継承などをつかわずに単純にしたほうが確かに見やすいと思います。
そもそもなぜこのようなことをしたかったのかというとEJBの呼び出しを
共通化させたかったのです。現在↓のようなシステムの構成を考えています。
親サーブレット-------------|
|
|
|----子サーブレット1-------EJB1
|
|
|
|----子サーブレット2-------EJB2
|
|
|
|----子サーブレット3-------EJB3
|
|
|
|----子サーブレットN-------EJBN
親サーブレットは子サーブレットの共通する処理を定義し、
子サーブレットはその機能独自の処理のみを実行するようにして、
共通化された部分は単純に親から呼び出すといった形にしたかったのです。
そしてその共通化させるという中にインタフェースの呼び出しがありその呼び出しを
共通化させるため1つのHome、Remoteインタフェースで複数の
Beanのインスタンス化を行いたかったのです。
子サーブレットは親サーブレットにどのBaenのインスタンス化を行うか
メッセージを送り、親サーブレットはそのメッセージを受け取りHome、
Remoteインタフェースの作成を行い、子サーブレットは単純に
呼び出すだけにしたかったのです。
No.2
- 回答日時:
> 子サーブレットは親サーブレットにどの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の設計上、問題
ないように思います。
何度もお返事をいただいて誠にありがとうございます。
この方法でもう一度設計をよく見直して行きます。
後、ポイントをつけるのを忘れてしまい申し訳ありませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
java eclipse 型に解決できません
-
同一パッケージにあるクラスが...
-
EclipseでJSPのコンパイルエラー
-
Cstring(日本語含む)をcharに...
-
ATLとMFCの違いは何でしょうか?
-
命名規約は連番でいいのか?
-
Eclipseで新規クラスを作成時、...
-
dllと同じプロジェクトにする方法
-
VBAもしくはVB6:クラスの中で...
-
僕の出身中学校は200人同級生が...
-
コンボボックスのマウスホイー...
-
Java「デフォルトのパッケージ...
-
自作のクラスファイルがインポ...
-
JSPからJavaクラスを参照できな...
-
「囲うインスタンス」のエラー...
-
共通で使う関数を集めたクラス...
-
どこからも呼ばれていない無意...
-
そんなにお金がなくても年に1度...
-
Sub-LVDS規格とは
-
携帯電話でのmicroSDカードのク...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
java eclipse 型に解決できません
-
どこからも呼ばれていない無意...
-
EclipseでJSPのコンパイルエラー
-
そんなにお金がなくても年に1度...
-
複数のクラスで共通した関数を...
-
恋愛
-
dllと同じプロジェクトにする方法
-
UMLのクラス図はmain()も含むん...
-
僕の出身中学校は200人同級生が...
-
配列の重複する値とその個数を...
-
同一パッケージにあるクラスが...
-
IPアドレスの3バイト目の呼び方
-
標準モジュールとクラスモジュ...
-
main()を持つクラスが2つ以上...
-
eclipse でクラスに色
-
共通で使う関数を集めたクラス...
-
VBAもしくはVB6:クラスの中で...
-
Cstring(日本語含む)をcharに...
-
IPアドレスのクラスAを取得して...
-
コンボボックスのマウスホイー...
おすすめ情報