【问题标题】:Callback between EJBs / local EJB callsEJB 之间的回调/本地 EJB 调用
【发布时间】:2011-02-07 14:56:01
【问题描述】:

您可以将 EJB A 注册为 MDB B 中的回调吗?

B.register(Aref)

在 B 中:A.callback()

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

【问题讨论】:

  • 更好地表述,我想从 MDB 分派到其他 bean A。我想动态地让 EJB 知道 B,所以我可以有一个从 MBD 到 A 的分派机制。

标签: interface callback ejb local


【解决方案1】:

您提出的问题在建议的方式中实际上是不可能的。

如果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 可以是一个临时目的地。

【讨论】:

    猜你喜欢
    • 2017-08-27
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 2011-12-23
    • 2011-11-21
    • 1970-01-01
    • 2014-02-08
    • 2015-01-25
    相关资源
    最近更新 更多