2011-02-07 10 views
0

EJB AをコールバックとしてMDB Bに登録できますか?EJB /ローカルEJBコール間のコールバック

Bで

B.register(Aref)

A.callback()

EJBはローカル電話を使用する場合アレフでしょうか? SessionContext.getEJBLocalObject()

+0

MDBから他のBean Aにディスパッチしたいのですが、私は動的にBをEJBに知らせたいので、MBDからAへのディスパッチ機構を持つことができました。 – weberjn

答えて

0

提案された方法では、あなたが求めることは実際にはありません。

BがMessage Driven Beanの場合、メソッドを呼び出すことは決してできません。メッセージングのパラダイムでは、メッセージの受信者のタイプは不明です。したがって、MDBのインスタンスを参照することはできません。代わりに、メッセージをキューまたはトピックに投稿し、MDBがそのメッセージを受信するように設定されている場合は、onMessage()メソッドが呼び出されます。

第2に、EJBでは、サンプルコードのように参照を渡すことはよくありません。どのような種類のEJB Beanがありますか?ステートレスセッションBean、またはステートフルセッションBean?

場合、それは、インスタンスは問題ないかもしれません、あなたはおそらくそれを注入することができ、ステートレスセッションBeanです:

@MessageDriven 
public class NSMessageDrivenBean implements MessageListener { 

    @EJB 
    private A yourABean; 

    public void onMessage(Message message) { 

     // process message and then call A 

     yourABean.someMethod();   

    } 
} 

コールバックに応じて(事前に不明な型に行われる必要がある場合メッセージが送信されている場合)、そのための1つのメカニズムはJMS replyです。メッセージ駆動型Beanに送信されたメッセージで

、あなたは、このようなコードが含ま:

message.setJMSReplyTo(someDestination); 
message.setJMSCorrelationID(someCorrelationID); 

someDestinationをあなたのコールバックを表し、それは何かがリスニングされている先だし、この何かが、その後呼び出すことができますステートレスセッションBean(クライアントのコンテキストで)を呼び出します。

など。

connection.createSession(false, Session.AUTO_ACKNOWLEDGE).createConsumer(someDestination).setMessageListener(
    new MessageListener() { 

     @Override 
     public void onMessage(Message message) { 
      yourABean.someMethod(); 
     } 
} 

この場合、someDestinationは一時的な宛先になる可能性があります。