Java 如何关闭Spring应用程序上下文,但不要';t停止JMS侦听器以避免;资源泄漏:';上下文';“永不关闭”吗;?
我想关闭Spring应用程序上下文,以避免出现“资源泄漏:上下文“从未关闭”警告。但是当我关闭它时,DefaultJMSListenerContainer也关闭了。因此,我无法再收到任何消息。我的问题是,我可以关闭ApplicationContext,但让JMSListenerContainer保持活动状态吗 JMSListenerContainer如下所示:Java 如何关闭Spring应用程序上下文,但不要';t停止JMS侦听器以避免;资源泄漏:';上下文';“永不关闭”吗;?,java,spring,memory-leaks,Java,Spring,Memory Leaks,我想关闭Spring应用程序上下文,以避免出现“资源泄漏:上下文“从未关闭”警告。但是当我关闭它时,DefaultJMSListenerContainer也关闭了。因此,我无法再收到任何消息。我的问题是,我可以关闭ApplicationContext,但让JMSListenerContainer保持活动状态吗 JMSListenerContainer如下所示: <bean id="jmsContainer" class="org.springframework.jms.listener.D
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="jmsConnectionFactory" />
<property name="destination" ref="topicDestination" />
<property name="messageListener" ref="clientMessageListener" />
</bean>
能否创建两个Spring应用程序上下文xml,将要关闭的一个Spring应用程序上下文与DefaultJMSListenerContainer分开?假设为DefaultJMSListenerContainer创建applicationContext-jms.xml,并为其他Spring上下文配置创建applicationContext.xml。关闭applicationContext.xml以避免出现“资源泄漏:上下文“从未关闭”警告。由于JMSListenerContainer是应用程序上下文的一部分,您不能仅关闭applicationContext并继续接收消息。您的应用程序需要上下文才能运行。
因此,我在这里看到两种选择:
@SuppressWarnings(“资源”)
将其禁用。jvm终止时,资源将被释放。所以你没有做错什么。
您还可以添加shutdownhook
((AbstractApplicationContext)上下文)代码>确保在jvw shutdowm上正常关闭spring上下文李>
使用以下构造创建上下文
public static void main(String[] args) throws IOException {
//try with resources guarantees that context will be closed
try(AbstractApplicationContext context = new ClassPathXmlApplicationContext("beans.xml")){
//some code...
//will wait any input in console to avoid immediate context closing
System.in.read();
}
}
你能用JMSListenerContainer配置更新问题吗?@Evgeny我添加了JMSListenerContainer,你可以参考它并给我建议。如果我不调用AbstractApplicationContext的close方法,MessageContainer可以工作。但是如果我叫它,MessageListenerContainer也会关闭。非常感谢你的热情,Evegeny。这两个选项都可以避免警告,但当JVM运行时,ApplicationContext实际上并没有关闭。我想知道这是否是一个真正的资源泄漏问题?@Linhoo您不需要在应用程序运行时关闭ApplicationContext。它不是一般意义上的资源AbstractApplicationContext
实现了Closeable
,这就是Eclipse显示资源泄漏警告的原因,但在本例中,这并不意味着泄漏是真实的。配置应该是resource。你知道ApplicationContext如何处理它吗?我还有一个问题,你可以在@Linhoo回答:@Linhoo是的,配置就是资源。不过,您不必担心,因为Spring绝对不允许任何内部资源泄漏。这将使applicationContext jms不会关闭。我的目标是避免所有资源潜在客户警告,而不是关闭一个或打开另一个。我还有一个问题,您可以在以下位置回答:我还有一个问题,您可以在以下位置回答: