У меня есть приложение на Play 2.4 (Java) с некоторыми фоновыми задачами Akka, реализованными как функции, возвращающие Promise.Play Framework 2.4 Последовательный запуск нескольких обещаний
- Task1 загружает банковские выписки через банк Rest API.
- Task2 обрабатывает заявления и связывает их с клиентами.
- Task3 делает некоторые другие обработки.
Task2 не может работать до того, как Task1 завершит свою работу. Task3 не может работать до Task2. Я пытался запустить их через последовательность Promise.map()
так:
protected F.Promise run() throws WebServiceException {
return bankAPI.downloadBankStatements().map(
result -> bankProc.processBankStatements().map(
_result -> accounting.checkCustomersBalance()));
}
Я был под впечатлением, что первая карта будет ждать, пока TASK1 не будет сделано, и тогда он будет вызывать TASK2 и так далее. Когда я смотрю в приложение (задачи записывают некоторую информацию об отладке в журнал), я вижу, что задачи выполняются параллельно.
Я также пытался использовать Promise.flatMap()
и Promise.sequence()
, не повезло. Задачи всегда работают параллельно.
Я знаю, что Play является неблокирующим приложением в природе, но в этой ситуации мне действительно нужно делать что-то в правильном порядке.
Есть ли общая практика о том, как выполнять несколько обещаний в выбранном порядке?
Ну, я использую 'F.Promise.promise (лямбда)', который возвращается 'processBankStatements' и' checkCustomerBalance'. Обещания не могут иметь недействительный тип результата, поэтому я возвращаю null от обещания. Таким образом, результаты не имеют значения. Все три функции/обещания выполняют некоторые задания в базе данных, и они ничего не возвращают. Единственная цель - запустить эти задания в выбранном порядке. Я знаю, что это не хороший подход и хорошее использование функций Play, но в этом случае это необходимо. В любом случае спасибо за совет. Я попробую. – spidla
Это не проблема, если возвращаемое значение не требуется, я просто проверял, что ответ был завершен. –
Ну, это не работает. Теперь все три обещания начинаются параллельно. – spidla