2011-02-07 3 views
0

Можете ли вы зарегистрировать EJB A как обратный вызов в MDB B?Обратный звонок между EJB/локальными вызовами EJB

B.register(Aref)

в B: A.callback()

Что бы Ареф, если EJBs использовать местные звонки? SessionContext.getEJBLocalObject()?

+0

Лучше сформулированный, я хотел бы отправить из MDB другим фасолям A. И я хотел динамически сделать B известным EJB, поэтому я мог бы иметь диспетчерский механизм от MBD до A. – weberjn

ответ

0

То, о чем вы просите, на самом деле невозможно.

Если B - это управляемый сообщением компонент, то на нем никогда невозможно вызвать метод. В парадигме обмена сообщениями тип получателя сообщения неизвестен. Таким образом, вы не можете ссылаться на экземпляр MDB. Вместо этого вы отправляете сообщения в очередь или тему, и если ваш MDB настроен на прослушивание, то его метод onMessage() будет вызываться.

Во-вторых, в EJB вы не часто передаете ссылки, как в вашем примере кода. Каким должен быть EJB bean? Асинхронный сеансовый компонент или сеансовый компонент с состоянием?

В случае это сессионный компонент, экземпляр не вопрос, и вы, вероятно, можете просто вводить его:

@MessageDriven 
public class NSMessageDrivenBean implements MessageListener { 

    @EJB 
    private A yourABean; 

    public void onMessage(Message message) { 

     // process message and then call A 

     yourABean.someMethod();   

    } 
} 

Если обратный вызов должен быть сделан к типу, который неизвестен заранее (в зависимости от отправляемое сообщение), то один из них для этого - через JMS reply.

В сообщении время отправки в управляемый сообщениями, вы затем включить код, как это:

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

someDestination представляет свой обратный вызов, это назначение, к которому что-то слушает, а потом это что-то можно вызвать вызовите сессионный компонент без состояния (в контексте клиента).

E.g. что-то вроде:

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

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

В этом случае someDestination может быть временным назначением.

Смежные вопросы