EJB /本地EJB调用之间的回调

时间:2011-02-07 14:56:01

标签: interface callback ejb local

您可以在MDB B中注册EJB A作为回调吗?

B.register(Aref)

B中的

A.callback()

如果EJB使用本地调用,Aref会是什么? SessionContext.getEJBLocalObject()

1 个答案:

答案 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可以是临时目的地。