gpt4 book ai didi

playframework - Play Framework : await-like functionality in Jobs

转载 作者:行者123 更新时间:2023-12-04 17:39:25 26 4
gpt4 key购买 nike

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

好吧,根据 Guillaume Bort ,一种选择是

to split your process into several small jobs



他举了以下例子:
@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();
}
}
}

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

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

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

最佳答案

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

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

waits if necessary for the computation to complete, and then retrieves its result.



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

谢谢!

关于playframework - Play Framework : await-like functionality in Jobs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7824668/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com