2

我在 spring bug tracker 中打开了这个 bug。如果这里的一些聪明人已经可以帮助我会很酷

https://jira.springsource.org/browse/SPR-9341

4

3 回答 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

您是否尝试过让您的@Scheduledbean 实现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 回答