Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:MDB和Spring';s单通BeanFactoryLocator_Java_Spring_Ejb - Fatal编程技术网

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) 如果没有,正确的使用方法是什么

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

  • 什么也没发生。相同的对象仍将位于相同的MDB中。MDB不在乎,Spring在这一点上不在考虑范围之内
  • 这实际上取决于使用环境。如果您只是使用Spring来组装对象,并且每个MDB都应该有自己的实例,那么答案是肯定的
  • 根据不同的使用案例,SpringBeanAutowiringInterceptor可能是更好的选择,也可能不是
  • 原型可能很棘手。你必须很好地理解你的豆子及其后果,才能让它达到你的预期。这就是为什么通常最好使SpringBean成为无状态的
  • 更新: 这实际上是一种竞赛条件。如果容器决定并行运行两个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,上下文就会被破坏。