Обратный вызов между EJB / локальными вызовами EJB - PullRequest
0 голосов
/ 07 февраля 2011

Можете ли вы зарегистрировать EJB A в качестве обратного вызова в MDB B?

B.register(Aref)

в B: A.callback()

Каким будет Aref, если EJB используютместные звонки?SessionContext.getEJBLocalObject()

1 Ответ

0 голосов
/ 08 февраля 2011

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

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

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

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

@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.

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

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

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

например. что-то вроде:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...