【问题标题】:Is it possible to re-Initialize beans in Spring at runtime?是否可以在运行时在 Spring 中重新初始化 bean?
【发布时间】:2012-08-08 07:13:25
【问题描述】:

我们有一个几乎 24x7 全天候在线的 Spring Web 应用程序。此应用程序使用 JMS 发送和接收来自其他系统的消息。在大多数情况下,一切都按预期工作。但是,有时我们会遇到网络故障或后端 JMS 提供程序 (JBOSS 5.1.0.GA) 挂起且必须重新启动的问题。因此,由于各种原因,Web 应用程序失去了与 JMS 提供者的连接。我们能够重新建立连接的唯一方法是重新启动 servlet 容器 (tomcat)。

有没有办法在运行时重新初始化 ConnectionFactory bean?我们在 applicationContext.xml 中定义了以下 bean:

      <bean id="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
            <property name="lookupOnStartup" value="false" />
        <property name="cache" value="false" />
        <property name="proxyInterface" value="javax.jms.ConnectionFactory" />
            <property name="jndiTemplate">
                    <ref bean="jndiTemplate" />
            </property>
            <property name="jndiName">
                    <value>ConnectionFactory</value>
            </property>
    </bean>

有没有办法重新初始化 bean,以便 bean 重新建立与提供者的连接?我们希望在应用程序运行时执行此操作,并避免重新启动应用程序或 servlet。

这在春天也有可能吗?

提前致谢。

【问题讨论】:

    标签: spring jms


    【解决方案1】:

    您可以将此 connectionFactory 包装在 Spring 提供的 ConnectionFactory - CachingConnectionFactory 周围,它支持自动恢复连接。

    <bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
        <property name="targetConnectionFactory" ref="jmsConnectionFactory"/>
        <property name="sessionCacheSize" value="5"/>
    </bean>
    

    【讨论】:

    • 感谢您的建议。不幸的是,ConnectionFactory 已经包裹在 Spring 的 CachingConnectionFactory 上。然而,连接并没有因错误而恢复。我们这样做是为了避免在发送/接收每条消息时创建和断开连接。还有什么可以做的吗?
    最近更新 更多