在我继承的代码库中,有一个MDB
调用SingletonBeanFactoryLocator().getIntance().useBean()
来获取ejbCreate()
中的工厂引用,然后从这个工厂获取一个特定的bean并将其存储为MDB
实例变量。 (工厂的类型为“ClassPathXmlApplicationContext
”)。
令人困惑的部分是:在获得该bean之后,它在同一个release()
的此工厂引用上调用“ejbCreate()
”。
现在,这个MDB
汇集了poolize'x
',我观察到的是,context xml
中定义的bean正在创建'x
'号码时间。所以我的猜测是,每次'ejbCreate()
'执行时,它都会重新创建一个上下文及其bean。
我查看了Spring文档上面的release()
,其中说:
In an EJB usage scenario this would normally be called from `ejbRemove()` and `ejbPassivate()`.
所以这是我的问题:
1)它是否真的创建了一个新的上下文并调用了新的bean everytime ejbCreate()
?
2)如果是,那么在前一次调用中创建的上下文/ bean会发生什么情况(例如,如果bean本身是单例,那么它们会被销毁)吗?
3)这是在上面的上下文中使用SingletonBeanFactoryLocator
(可能是线程安全问题)的正确方法吗?
4)如果没有,是使用它的正确方法?
编辑:我能想到的一种可能性是使相关的beanprototype
使每个MDB实例都是线程安全的,因此不需要释放和重新创建上下文。等待其他意见/建议。
答案 0 :(得分:1)
SpringBeanAutowiringInterceptor
可能是也可能不是更好的选择。 <强>更新强>
实际上存在竞争条件。如果容器决定并行运行两个MDB的ejbCreate()
,那么它们最终将共享相同的应用程序上下文。
更新2: 我找不到一个明确允许EJB通过并行线程创建的部分,但我也找不到明确禁止它的部分。
鉴于规范中的以下部分,我认为这样做符合规范的精神。
典型的EJB容器提供可伸缩的运行时环境,以同时执行大量消息驱动的对象。
消息驱动bean模型的另一个目标是允许通过容器提供的消息驱动bean实例池来并发处理消息流。
当容器启动时,容器有责任确保消息驱动的bean存在,并且在启动消息传递之前,bean的实例已准备好接收异步消息传递。
容器允许消息驱动的bean类的许多实例同时执行,从而允许并发处理消息流。不保证将消息传递到消息驱动bean类的实例的确切顺序,尽管容器应该在不损害消息处理的并发性时尝试按顺序传递消息。