繁体   English   中英

在春季计划任务

[英]Scheduling Tasks in Spring

我们有一个要求,我们必须在X可能为30-60的数据库中收集X分钟的文档。 将这些文档收集到数据库中之后,我们必须通过REST调用将它们推送到单独的服务。

由于这些文档不会很大,因此我们将它们汇总在一起,然后将它们一起推送。

现在,必须在固定的时间间隔后推送这些文档,因此我想到了创建一个单独的线程,该线程从数据库中提取记录,将其推送到服务,并且一旦服务响应为200 OK,我就从数据库中删除这些记录,线程进入睡眠状态X分钟。

class PushDocumentsToService extends Thread{
    DocumentRepository documentRepository;
    DocumentProcessingService documentProcessingService
    public void run(){
        List<Document> list = documentRepository.getAllDocuments();
        Integer statusCode = documentProcessingService.sendDocuments(list);
        if(statusCode == 200)
            documentRepository.remove(list);
        try{
            Thread.sleep(30*60);
        }catch(..){..}
    }    

}

现在,我的一些同事已建议我不要在代码中使用Thread.sleep。 我无法理解...的不良影响

Thread.sleep()

Spring Scheduler和Google Guava等库和框架还可以使用哪些方法来进行计划任务?

您需要做的就是使用ScheduledExecutorService安排线程并提供适当的频率速率。

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);    

Thread t1= new PushDocumentsToService();    
scheduledThreadPool.scheduleAtFixedRate(t1, 0, 30,TimeUnit.SECONDS);

如果您的类路径中有Spring Scheduling库,则将@Scheduled批注添加到希望在一段时间内执行的方法。 无需扩展Thread或实现Runnable Spring会代您处理所有这些工作。

您知道,只要应用程序正在运行

@Scheduled(cron = "30 * * * * *")
public void loadDataIntoRepository() {
    // your code
}

出于以下原因, 建议使用Thread.sleep

  • 现在 ,在休眠期间,执行代码的线程将阻塞 30分钟是您的线程被阻塞的长时间。
  • 您的线程可能会中断,无法为您提供从错误状态中恢复的真正方法。
  • 出于可维护性的考虑,当功能已经存在并且已经过充分测试时,您不必通过计划重新设计轮子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM