通过dev-tools重新启动Web服务器时,计划任务不会停止

时间:2019-02-06 16:40:00

标签: java spring scheduled-tasks

我有这个问题:

我正在安排任务每10分钟运行一次。当它运行时,我希望两次检查失败都会收到两封电子邮件。

但是,当我编辑我的项目时,开发工具会选择所做的更改并重新启动spring应用程序。但这是问题所在:我仍然从运行中的旧应用程序收到电子邮件。

我该怎么做才能正确终止该应用程序?恐怕这个问题也会影响生产环境。

代码:

@Component
public class CheckRunner implements Runnable {
    private static final Logger log = LoggerFactory.getLogger(CheckRunner.class);

    private static boolean runOnce = true;

    private final long DEFAULT_CHECKING_INITIAL = 1L;
    private final long DEFAULT_CHECKING_PERIOD = 10L;

    @Autowired
    public EmailServiceImpl emailService;

    /**
     * Construct and schedule a CheckRunner 
     */
    public CheckRunner() {
        if(runOnce) {
            runOnce = false;
            log.info("Starting check runner.");
            ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
            exec.scheduleAtFixedRate(this, DEFAULT_CHECKING_INITIAL , DEFAULT_CHECKING_PERIOD, TimeUnit.MINUTES);
        }
    }

    /**
     * Run the checks once
     */
    @Override
    public void run() {
        log.info("Checking thread running.");
        checks();
    }

    /**
     * Do the checks
     */
    private void checks() {
        StringBuilder sb = new StringBuilder();
        //sb.append("<pre>");
        WebServerAvailablityCheck.runAllChecks(sb, emailService);
        //sb.append("</pre>");
    }

}

1 个答案:

答案 0 :(得分:1)

如果您在java.io.Closeable bean上实现CheckRunner并从其中调用执行器上的shutdown(),那么当bean被销毁时,Spring将调用Closeable.close()。这将使您的执行程序线程正常关闭。