您可以在MDB B中注册EJB A作为回调吗?
B.register(Aref)
:A.callback()
如果EJB使用本地调用,Aref会是什么?
SessionContext.getEJBLocalObject()
?
答案 0 :(得分:0)
你提出的问题实际上是不可能的。
如果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上的调用(在客户端的上下文中)。
E.g。类似的东西:
connection.createSession(false, Session.AUTO_ACKNOWLEDGE).createConsumer(someDestination).setMessageListener(
new MessageListener() {
@Override
public void onMessage(Message message) {
yourABean.someMethod();
}
}
在这种情况下,someDestination可以是临时目的地。