簡體   English   中英

關閉 tomcat 時,我遇到了 [commons-pool-EvictionTimer] 但未能阻止它

[英]When shut down tomcat i met [commons-pool-EvictionTimer] but has failed to stop it

服務器版本:Apache Tomcat/8.0.26
服務器建成時間:2015 年 8 月 18 日 11:38:37 UTC
服務器編號:8.0.26.0
操作系統名稱:Linux
操作系統版本:2.6.32-642.3.1.el6.x86_64
架構:amd64
JVM 版本:1.8.0_60-b27
JVM 供應商:甲骨文公司

我正在使用 jedis 版本:2.8.2(commons-pool2:2.4.2) 當我關閉 tomcat 時,有一些警告消息。

13-Feb-2017 08:12:14.006 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [commons-pool-EvictionTimer] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.lang.Object.wait(Native Method)
java.util.TimerThread.mainLoop(Timer.java:552)
java.util.TimerThread.run(Timer.java:505)

這是絕地武士的一些conf。


...
@Bean(name = "jedisConnectionFactory", destroyMethod = "destroy")

public JedisConnectionFactory jedisConnectionFactory() throws IOException {
    final Properties redisConfig = PropertiesLoaderUtils.loadProperties(
                new PathMatchingResourcePatternResolver().getResource("classpath:redis.properties"));

    final JedisConnectionFactory result = new JedisConnectionFactory();
    result.setHostName(redisConfig.getProperty("redis.hostName"));
    result.setPort(Integer.parseInt(redisConfig.getProperty("redis.port")));
    result.setUsePool(Boolean.parseBoolean(redisConfig.getProperty("redis.pool.use")));
    result.setTimeout(Integer.parseInt(redisConfig.getProperty("redis.timeout")));
    result.setPoolConfig(createJedisPoolConfig(redisConfig));
    result.afterPropertiesSet();
    return result;
    }
...

我怎樣才能解決這個問題?

看起來像一個已知問題,請參閱https://github.com/xetorthio/jedis/issues/936

顯然,您不需要清理JedisConnectionFactory本身,而是需要在工廠的幫助下創建的連接池。

問題是JedisConnectionFactory.afterPropertiesSet()被調用兩次,一次在您的代碼中( result.afterPropsertiesSet() ),一次由 Spring 調用。 JedisConnectionFactory.afterPropsertiesSet()創建 Jedis 連接池,它為每次調用將驅逐計時器任務添加到 ScheduledThreadPoolExecutor。 JedisConnectionFactory 只保留最近創建的池,所以在清理時,只有最后一個驅逐計時器任務被取消,而其他則沒有。 這可以防止 ScheduledThreadPoolExecutor 的線程關閉。

如果您刪除對result.afterPropertiesSet()調用,那么只會創建一個帶有一個驅逐任務的池,並且一旦 Spring 銷毀 JedisConnectionFactory,該線程將關閉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM