美好的一天!我有一些休眠应用程序在独立的apache tomcat上运行。我有一个简单的任务@Scheduled注释,如下所示:
@Scheduled(fixedRate = 200000)
private void updateSettings() {
//do some cool stuff
}
因此,当我运行我的应用程序时,我会得到类似的内容:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.scheduling.TaskScheduler' available
和
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.util.concurrent.ScheduledExecutorService' available
但它确实有效。猜猜春天会让一些牧羊人自己。 我试着解决这个问题,并在我的应用程序配置类中添加了
@EnableScheduling
和
@Bean
public TaskScheduler taskScheduler() {
return new ConcurrentTaskScheduler();
}
@Bean
public Executor taskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setWaitForTasksToCompleteOnShutdown(false);
return taskExecutor;
//or return new SimpleAsyncTaskExecutor(); - nothing changes
}
在我对tomcat执行./shutdown后,我收到警告
2018-01-26 21:44:02 DEBUG DisposableBeanAdapter:246 - Invoking destroy() on bean with name
org.springframework.context.annotation. internalScheduledAnnotationProcessor
26-Jan-2018 21:44:02.496 WARNING [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [SecureChat] appears to have started a thread named [pool-4-thread-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.base@9.0.1/jdk.internal.misc.Unsafe.park(Native Method)
java.base@9.0.1/java.util.concurrent.locks.LockSupport. parkNanos(LockSupport.java:234)
java.base@9.0.1/java.util.concurrent. locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2104)
java.base@9.0.1/java.util.concurrent. ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1131)
java.base@9.0.1/java.util.concurrent. ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:848)
java.base@9.0.1/java.util.concurrent. ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1092)
java.base@9.0.1/java.util.concurrent. ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)
java.base@9.0.1/java.util.concurrent. ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
java.base@9.0.1/java.lang.Thread.run(Thread.java:844)
正如我所看到的 - 记忆确实泄漏了。什么可以解决这个问题?
Ubuntu linux 16.04,apache tomcat 8.5,spring 5,java 9
更新: 这是一个测试项目 - 将其上传到tomcat,然后启动/停止 - 你会得到内存泄漏。