猿问

当开发工具重新启动 Web 服务器时,计划任务不会停止

我有这个问题:


我正在安排每 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>");

    }


}


泛舟湖上清波郎朗
浏览 102回答 1
1回答

DIEA

如果您在 bean 上实现java.io.Closeable并CheckRunner从其中调用shutdown()executor,那么 Spring 将Closeable.close()在 bean 被销毁时调用。这将导致您的执行程序线程优雅地关闭。
随时随地看视频慕课网APP

相关分类

Java
我要回答