@Scheduled Tasks在独立程序想要退出时保持JVM挂起,JVM需要被杀死

时间:2012-04-24 14:49:28

标签: java multithreading spring jvm scheduled-tasks

我在春虫追踪器中打开了这个bug。如果这里的一些聪明人能够帮助我,那会很酷吗

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

3 个答案:

答案 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