Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.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 如何关闭Spring应用程序上下文,但不要';t停止JMS侦听器以避免;资源泄漏:';上下文';“永不关闭”吗;?_Java_Spring_Memory Leaks - Fatal编程技术网

Java 如何关闭Spring应用程序上下文,但不要';t停止JMS侦听器以避免;资源泄漏:';上下文';“永不关闭”吗;?

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

我想关闭Spring应用程序上下文,以避免出现“资源泄漏:上下文“从未关闭”警告。但是当我关闭它时,DefaultJMSListenerContainer也关闭了。因此,我无法再收到任何消息。我的问题是,我可以关闭ApplicationContext,但让JMSListenerContainer保持活动状态吗

JMSListenerContainer如下所示:

<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不会关闭。我的目标是避免所有资源潜在客户警告,而不是关闭一个或打开另一个。我还有一个问题,您可以在以下位置回答:我还有一个问题,您可以在以下位置回答: