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

Interface EJB/本地EJB调用之间的回调,interface,callback,ejb,local,Interface,Callback,Ejb,Local,您可以在MDB中将EJB注册为回调吗 B.寄存器(Aref) 在B中:A.callback() 如果EJB使用本地调用,Aref将是什么? SessionContext.getEJBLocalObject()?以建议的方式,您提出的问题实际上是不可能的 如果B是一个消息驱动Bean,那么永远不可能对其调用方法。在消息传递范例中,消息接收者的类型未知。因此,您不能引用MDB的实例。相反,您将消息发布到队列或主题,并且如果您的MDB配置为侦听消息,则将调用其onMessage()方法 其次,在EJB

您可以在MDB中将EJB注册为回调吗

B.寄存器(Aref)

在B中:
A.callback()

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

以建议的方式,您提出的问题实际上是不可能的

如果
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回复

在发送给消息驱动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可以是一个临时目的地。

更好的表述是,我想从MDB向其他bean a分派。我想动态地让EJB知道B,这样我就可以有一个从MBD到a的分派机制。