我们有一个要求,我们必须在数据库中收集X分钟的文档,其中X可能是30-60。将这些文档收集到数据库后,我们必须通过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的库和框架还使用什么方法来计划任务?
答案 0 :(得分:1)
您要做的只是使用ScheduledExecutorService
来安排线程并提供适当的频率速率。
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
Thread t1= new PushDocumentsToService();
scheduledThreadPool.scheduleAtFixedRate(t1, 0, 30,TimeUnit.SECONDS);
答案 1 :(得分:1)
如果您的类路径中有Spring Scheduling库,请将@Scheduled
annotation添加到您希望在一段时间内执行的方法。无需扩展Thread
或实现Runnable
;通过Spring代表您完成所有工作。
您知道,只要应用程序正在运行 。
@Scheduled(cron = "30 * * * * *")
public void loadDataIntoRepository() {
// your code
}
出于以下原因,建议使用Thread.sleep
是 ill 的原因: