アプリ版:「スタンプのみでお礼する」機能のリリースについて

はじめまして、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


このようなことは可能なのでしょうか?

A 回答 (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インタフェースを定義すべきなんだと思いますが。。。
    • good
    • 0
この回答へのお礼

spoonyさんお返事ありがとうございました。
その後色々と考えたり、周りの人に相談したりしたのですが、
確かにspoonyさんのご指摘にもあったように

↓の構成のように1対1の関係の設計の方が
いいような気がします。

         |-------------Home--------
         |                   |
クライアント--|                  Bean
         |                   |
         |-------------Remote-----


下手に継承などをつかわずに単純にしたほうが確かに見やすいと思います。
そもそもなぜこのようなことをしたかったのかというとEJBの呼び出しを
共通化させたかったのです。現在↓のようなシステムの構成を考えています。


親サーブレット-------------|
                  |
                  |
                  |----子サーブレット1-------EJB1
                  |
                  |
                  |
                  |----子サーブレット2-------EJB2
                  |
                  |
                  |
                  |----子サーブレット3-------EJB3
                  |
                  |
                  |
                  |----子サーブレットN-------EJBN


親サーブレットは子サーブレットの共通する処理を定義し、
子サーブレットはその機能独自の処理のみを実行するようにして、
共通化された部分は単純に親から呼び出すといった形にしたかったのです。
そしてその共通化させるという中にインタフェースの呼び出しがありその呼び出しを
共通化させるため1つのHome、Remoteインタフェースで複数の
Beanのインスタンス化を行いたかったのです。
子サーブレットは親サーブレットにどのBaenのインスタンス化を行うか
メッセージを送り、親サーブレットはそのメッセージを受け取りHome、
Remoteインタフェースの作成を行い、子サーブレットは単純に
呼び出すだけにしたかったのです。

お礼日時:2002/07/03 11:28

> 子サーブレットは親サーブレットにどの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の設計上、問題
ないように思います。
    • good
    • 0
この回答へのお礼

何度もお返事をいただいて誠にありがとうございます。
この方法でもう一度設計をよく見直して行きます。
後、ポイントをつけるのを忘れてしまい申し訳ありませんでした。

お礼日時:2002/07/03 13:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!