我在春虫追踪器中打开了这个bug。如果这里的一些聪明人能够帮助我,那会很酷吗
答案 0 :(得分:4)
在调度程序的守护进程属性上设置“true” - 例如
<!-- task scheduling for @Scheduled annotation -->
<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>
<task:executor id="myExecutor" pool-size="1" />
<bean id="myScheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
<property name="poolSize" value="2" />
<property name="threadNamePrefix" value="myScheduler-"/>
<property name="waitForTasksToCompleteOnShutdown" value="false" />
<property name="daemon" value="true" />
</bean>
答案 1 :(得分:0)
您是否尝试过使用@Scheduled
bean实现DisposableBean
(因此可以在Spring上下文关闭时通知它)并明确关闭main()
方法中的上下文?
从概念上讲,我没有看到发布的代码如何按预期工作。 Spring需要启动新线程以按您配置的时间/速率运行@Scheduled
任务,这意味着当main()
方法中的代码退出时,JVM中仍有非守护程序线程运行。如果你没有告诉Spring关闭这些线程,那么它们将如何被终止?
编辑:要明确,我认为解决方案是明确调用close()
上的ApplicationContext
。否则Spring没有办法告诉执行程序服务运行您的计划任务以关闭自己。当main()
退出时,将不会调用JVM关闭挂钩,因为非守护程序线程仍在运行。
答案 2 :(得分:0)
这是使用Java config
的解决方案@Bean
public TaskScheduler daemonTaskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setDaemon(false);
taskScheduler.setThreadNamePrefix("daemon");
taskScheduler.setPoolSize(5);
return taskScheduler;
}
或者如果你想真正了解细节,配置类可以是这样的
@Configuration
public class SchedulerConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
虽然可以在单个应用程序中使用多个TaskScheduler,但不支持一件事。我为那个
打开了JIRA