Play Framework: функциональность, подобная await, в заданиях

Я пытаюсь запустить длительную задачу (без блокировки пула выполнения 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) ...

Итак, как лучше всего приостановить начальное задание до завершения нового меньшего задания?

5
задан stikkos 19 October 2011 в 16:27
поделиться