Play Framework:乔布斯中类似于等待的功能

sti*_*kos 5 scheduled-tasks playframework

我正在尝试使用Play中的异步作业运行长时间运行的任务(不阻止HTTP请求执行池).Play中的Jobs完全由框架管理,因此Play将负责数据库连接和事务.这意味着作业在单个事务中作为普通调用运行.这对于大多数用例来说都很棒,但是如果你需要在作业完成之前提交一些数据呢?

那么,据Guillaume Bort说,一种选择就是

将您的流程分成几个小工作

他给出了以下例子:

@On("0 0 12 * * ?") 
public class UpdateCounters extends Job { 
   public void doJob() { 
       List<Employee> empList = Employee.find("long and boring SQL :)").fetch(); 
       for(Employee emp : empList) { 
           new UpdateEmployeeJob(emp).now().get(); 
       } 
   } 
}
Run Code Online (Sandbox Code Playgroud)

这很酷......每个新工作都有自己的事务,所以当这个新工作完成时,它会提交数据.干净简单!但是如果你不想这样做呢?假设您需要等到数据提交后再继续初始作业?

通常,您将从新作业中检索Promise并调用await(jobPromise),但这在作业中不起作用(等待仅在扩展Controller时可用且未在作业上实现)...

那么,在新的小型工作完成之前暂停初始工作的最佳方法是什么?

sti*_*kos 8

在查看Job是否已完成(不使用数据库)的不同方法之后,我注意到Play Promise实现了Future接口,因此具有isDone()操作,可用于检查任务是否完成.

更好的是,Future接口还定义了一个get()方法

如果需要等待计算完成,然后检索其结果.

因此暂停初始作业直到新的较小作业完成,可以通过调用Promise上的get()来实现,当在较小的作业上调用now()时返回(就像在Guillaume的示例中所做的那样)

谢谢!