2011-02-07 26 views
0

您可以將EJB A註冊爲MDB B中的回調嗎? A.callback()EJB /本地EJB調用之間的回調

會是什麼阿里夫如果使用EJB的本地電話:

B.register(Aref)

B中

SessionContext.getEJBLocalObject()

+0

更好的公式化,我想從MDB派發給其他bean A.我想動態地讓EJB知道B,所以我可以有一個從MBD到A的調度機制。 – weberjn 2011-02-08 14:51:53

回答

0

你提出的問題在提議的方式中並不是真的可行。

如果B是消息驅動的Bean,那麼永遠不可能調用它的方法。在消息傳遞範例中,消息接收者的類型是未知的。因此您不能引用MDB的實例。而是將消息發佈到隊列或主題,並且如果您的MDB配置爲傾聽將調用其方法onMessage()。其次,在EJB中,你並不經常像在你的代碼中那樣傳遞引用。 A應該是什麼樣的EJB 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();   

    } 
} 

在情況下,它是一個無狀態會話bean實例可能沒有關係,你可能只把它注射該消息正在發送),那麼一種機制是通過JMS reply

在消息被髮送到消息驅動Bean,你再有這樣的代碼:

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

someDestination代表你的回調,這是一個目標:某物聽,然後這個東西可以調用調用無狀態會話bean(在客戶端上下文中)。

E.g.例如:

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

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

在這種情況下,someDestination可以是臨時目標。