То, что вы спрашиваете, на самом деле не возможно предлагаемым способом.
Если 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 может быть временным пунктом назначения.