在Spring中安排任务

问题描述 投票:0回答:2

我们有一个要求,我们必须在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的库和框架用于调度任务的方法是什么?

java spring guava spring-scheduled
2个回答
1
投票

你需要做的就是使用ScheduledExecutorService来安排一个线程并提供这样的合适的频率。

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);    

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

1
投票

如果您的类路径中有Spring Scheduling库,请将@Scheduled annotation添加到您希望在一段时间内执行的方法中。无需延长Thread或实施Runnable;这一切都是通过Spring代表您完成的。

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

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

由于以下几个原因,建议使用Thread.sleep

  • 执行代码的线程现在在睡眠期间被阻止。 30分钟是很长一段时间让您的线程被阻止。
  • 您的线程可能会被中断,从而无法从错误状态中恢复。
  • 出于可维护性的考虑,您不希望在已经存在该功能且已经过充分测试的情况下通过调度重新发明轮子。
© www.soinside.com 2019 - 2024. All rights reserved.