0

在我继承的代码库中,有一个MDBwhich 正在调用SingletonBeanFactoryLocator().getIntance().useBean()以在其 中获取工厂引用ejbCreate(),然后从该工厂获取特定的 bean 并将其存储为MDB实例变量。(工厂类型为“ ClassPathXmlApplicationContext”)。

令人困惑的部分是:release()在获得该 bean 之后,它在同一个工厂引用上调用“ ” ejbCreate()

现在,这MDB是与 poolsize ' x' 合并的,我观察到的是,其中定义的 beancontext xml被创建了 ' x' 次数。所以我的猜测是,每次 ' ejbCreate()' 执行时,它都会重新创建一个上下文及其 bean。

我检查了 Spring 文档的 'release()上面说:

In an EJB usage scenario this would normally be called from `ejbRemove()` and `ejbPassivate()`.

所以这是我的问题:

1)是否真的创建了一个新的上下文并everytime ejbCreate()调用了新的bean?

2) 如果是,那么在上一次调用中创建的上下文/bean 会发生什么情况(例如,如果 bean 本身是单例的,它们会被销毁吗)?

3)这是在上面的上下文中使用SingletonBeanFactoryLocator(可能是线程安全问题)的正确方法吗?

4)如果没有,正确的使用方法什么?

编辑:我能想到的一种可能性是使相关的 beanprototype使每个 MDB 实例线程安全,因此无需释放和重新创建上下文。等待其他意见/建议。

4

1 回答 1

1
  1. 是的
  2. 没发生什么事。相同的对象仍将位于相同的 MDB 中。MDB 不在乎,此时 Spring 已不在考虑范围之内。
  3. 这真的取决于使用环境。如果你只是使用 Spring 来组装对象并且每个 MDB 都应该有它自己的实例,那么答案是肯定的。
  4. 根据用例SpringBeanAutowiringInterceptor,可能是也可能不是更好的选择。
  5. 原型可能很棘手。您必须充分了解您的 bean 及其后果,才能使其达到您的预期。这就是为什么通常最好让春豆无国籍。

更新: 实际上存在竞争条件。如果容器决定ejbCreate()并行运行两个 MDB,那么它们最终将共享相同的应用程序上下文。

更新 2: 我找不到明确允许通过并行线程创建 EJB 的部分,但我也找不到明确禁止它的部分。

鉴于规范中的以下部分,我认为这样做符合规范的精神。


2.4.2 消息驱动对象

一个典型的 EJB 容器提供了一个可伸缩的运行时环境来同时执行大量的消息驱动对象。

5.2 目标

消息驱动 bean 模型的另一个目标是允许通过容器提供的消息驱动 bean 实例池的方式并发处理消息流。

5.4 消息驱动 Bean 实例与其容器之间的协议

容器负责确保消息驱动的 bean 在容器启动时出现,并且 bean 的实例在消息传递开始之前准备好接收异步消息传递。

5.4.11 消息处理的并发性

容器允许消息驱动的 bean 类的多个实例同时执行,从而允许并发处理消息流。不保证将消息传递到消息驱动 bean 类的实例的确切顺序,尽管容器应该在不损害消息处理的并发性的情况下尝试按顺序传递消息。

于 2012-08-03T12:47:45.410 回答