我在 spring bug tracker 中打开了这个 bug。如果这里的一些聪明人已经可以帮助我会很酷
问问题
3353 次
3 回答
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>
于 2013-09-30T05:19:45.617 回答
0
您是否尝试过让您的@Scheduled
bean 实现DisposableBean
(以便在 Spring 上下文关闭时通知它)并在您的main()
方法中显式关闭上下文?
从概念上讲,我看不出发布的代码如何像您期望的那样工作。Spring 需要以@Scheduled
您配置的时间/速率启动新线程来运行您的任务,这意味着当您的main()
方法中的代码退出时,JVM 中仍在运行非守护线程。如果你不告诉 Spring 关闭这些线程,那么它们将如何被终止?
编辑:要清楚,我认为解决方案是明确调用close()
您的ApplicationContext
. 否则 Spring 没有办法告诉运行计划任务的执行器服务自行关闭。退出时不会调用 JVM 关闭挂钩,main()
因为非守护线程仍在运行。
于 2012-04-24T15:56:24.497 回答
0
这是使用 Java 配置的解决方案
@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
于 2017-12-06T11:59:08.643 回答