您提出的问题在建议的方式中实际上是不可能的。
如果B 是一个消息驱动Bean,那么就永远不可能调用它的方法。在消息传递范式中,消息接收者的类型是未知的。因此,您不能引用 MDB 的实例。相反,您将消息发布到队列或主题,并且如果您的 MDB 配置为侦听,则将调用其 onMessage() 方法。
其次,在 EJB 中,您不会像示例代码中那样经常传递引用。 A 应该是哪种 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();
}
}
如果需要提前对未知类型执行回调(取决于正在发送的消息),那么一种机制是通过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 可以是一个临时目的地。