Spring-MVC动态Cron任务Tomcat关机异常问题求助
Spring MVC动态Cron任务Tomcat关机时无法正常停止
我在Spring MVC中实现了动态Cron任务,用户可通过XHTML页面切换任务状态。任务运行正常,但Tomcat关机时出现异常,无法正常停止,尝试过相关解决方案但问题依旧。环境为JDK 17 + Tomcat 9。
错误信息
02-Feb-2023 14:17:58.960 WARNING [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [MuhurUM] registered the JDBC driver [oracle.jdbc.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 02-Feb-2023 14:17:58.961 WARNING [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [MuhurUM] appears to have started a thread named [Timer-0] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: java.base@17.0.4/java.lang.Object.wait(Native Method) java.base@17.0.4/java.lang.Object.wait(Object.java:338) java.base@17.0.4/java.util.TimerThread.mainLoop(Timer.java:537) java.base@17.0.4/java.util.TimerThread.run(Timer.java:516) 02-Feb-2023 14:17:58.962 WARNING [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [MuhurUM] appears to have started a thread named [pool-3-thread-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: java.base@17.0.4/jdk.internal.misc.Unsafe.park(Native Method) java.base@17.0.4/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:252) java.base@17.0.4/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1672) java.base@17.0.4/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1182) java.base@17.0.4/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:899) java.base@17.0.4/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1062) java.base@17.0.4/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1122) java.base@17.0.4/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) java.base@17.0.4/java.lang.Thread.run(Thread.java:833)
相关代码
@Service public class CronUtil { @Autowired private TaskScheduler taskScheduler; public void scheduleATask(Long id, Runnable tasklet, String cronExpression) { ScheduledFuture<?> scheduledTask = taskScheduler.schedule(tasklet, new CronTrigger(cronExpression, TimeZone.getTimeZone(TimeZone.getDefault().getID()))); TestApplication.jobsMap.put(id, scheduledTask); } public void removeScheduledTask(Long id) { ScheduledFuture<?> scheduledTask = TestApplication.jobsMap.get(id); if (scheduledTask != null) { scheduledTask.cancel(true); TestApplication.jobsMap.remove(id); } } }
内容的提问来源于stack exchange,提问作者Oytun Canatan
相关产品推荐
相关产品推荐

