Я пытаюсь запустить длительную задачу (без блокировки пула выполнения HTTP-запросов), используя асинхронные задания в игре. Задания в Play полностью управляется фреймворком, поэтому Play позаботится о соединениях и транзакциях с базой данных. Это означает, что задание выполняется как простой вызов в рамках одной транзакции. Это отлично подходит для большинства случаев использования, но что, если вам нужно зафиксировать некоторые данные до завершения задания?
Что ж, согласно Гийому Борту , одним из вариантов было бы
разделить процесс на несколько небольших заданий
Он приводит следующий пример:
@On("0 0 12 * * ?")
public class UpdateCounters extends Job {
public void doJob() {
List empList = Employee.find("long and boring SQL :)").fetch();
for(Employee emp : empList) {
new UpdateEmployeeJob(emp).now().get();
}
}
}
Это круто ... Каждое новое задание будет иметь свою собственную транзакцию, поэтому, когда это новое задание завершается, оно фиксирует эти данные. Чисто и просто! Но что, если вы не хотите делать это асинхронным? Скажем, вам нужно дождаться фиксации данных, прежде чем продолжить начальное задание?
Обычно вы извлекаете обещание из нового задания и вызываете await (jobPromise), но это не работает в задании (ожидание только доступно при расширении Controller и не реализовано в Job) ...
Итак, как лучше всего приостановить начальное задание до завершения нового меньшего задания?