Java:MDB和Spring';s单通BeanFactoryLocator
在我继承的代码库中,有一个Java:MDB和Spring';s单通BeanFactoryLocator,java,spring,ejb,Java,Spring,Ejb,在我继承的代码库中,有一个MDB调用SingletonBeanFactoryLocator().getIntance().useBean()在其ejbCreate()中获取工厂引用,然后从该工厂获取特定bean并将其存储为MDB实例变量。(工厂类型为“ClassPathXmlApplicationContext”) 令人困惑的部分是:在获得该bean之后,它在同一个ejbCreate()中调用该工厂引用上的“release()” 现在,这个MDB与poolsize'x'合并在一起,我观察到,上下
MDB
调用SingletonBeanFactoryLocator().getIntance().useBean()
在其ejbCreate()
中获取工厂引用,然后从该工厂获取特定bean并将其存储为MDB
实例变量。(工厂类型为“ClassPathXmlApplicationContext
”)
令人困惑的部分是:在获得该bean之后,它在同一个ejbCreate()
中调用该工厂引用上的“release()
”
现在,这个MDB
与poolsize'x
'合并在一起,我观察到,上下文xml
中定义的bean被创建了'x
'次。所以我的猜测是,每次执行“ejbCreate()
”时,它都会重新创建一个上下文及其bean
我检查了Spring文档上面的“release()
”,上面写着:
In an EJB usage scenario this would normally be called from `ejbRemove()` and `ejbPassivate()`.
下面是我的问题:
1) 每次调用ejbCreate()时,它真的会创建一个新的上下文和新的bean吗
2) 如果是,在上一次调用中创建的上下文/bean会发生什么情况(例如,如果bean本身是单例的,它们会被销毁吗)
3) 这是在上述上下文中使用SingletonBeanFactoryLocator
(可能用于线程安全问题)的正确方法吗
4) 如果没有,正确的使用方法是什么
编辑:我能想到的一种可能性是使相关beanprototype
使每个MDB实例线程安全,因此无需释放和重新创建上下文。等待其他意见/建议
ejbCreate()
更新2:
我找不到明确允许通过并行线程创建EJB的部分,但也找不到明确禁止它的部分
鉴于规范中的以下部分,我认为这样做符合规范的精神
2.4.2消息驱动对象
一个典型的EJB容器提供了一个可伸缩的运行时环境,以同时执行大量mes-sage驱动的对象
5.2目标
消息驱动bean模型的另一个目标是允许通过容器提供的消息驱动bean实例池来并发处理消息流
5.4消息驱动Bean实例与其容器之间的协议
容器的责任是确保消息驱动bean在容器启动时存在,并且bean的实例在消息交付开始之前准备好接收异步消息交付
5.4.11消息处理的并发性
容器允许消息驱动bean类的多个实例并发执行,从而允许并发处理消息流。没有保证消息传递到消息驱动bean类实例的确切顺序,尽管容器应该在不影响mes-sage处理的并发性时尝试按顺序传递消息。谢谢您的回答。规范是否允许服务器通过并行线程创建ejb?你能在你的回答中给出更新的参考吗?谢谢你的参考。假设可能存在竞速条件,一种可能是使beanFactory静态,并将其加载到静态块中,这样就没有竞速了。之后,在ejbCreate()中,它将继续请求相关的bean,如果原型bean适合这里,然后,我们不需要为每个ejbCreate关闭和重新创建上下文。您可以通过不使beanFactory成为静态并在@PreDestory
而不是@PostConstruct
方法中关闭它来实现同样的目的。这有几个优点,比如一旦取消部署所有bean,上下文就会被破坏。