Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Думается мне, что передача промиса актору так и напрашивается на проблемы.
Я бы использовал такой подход, только если использование ask сильно бьет по производительности (в чем есть сомнения) и если актор гарантированно локальный. Но если актор гарантированно локальный, то в чем смысл создания актора для заполнения промисов, который внутри выполняет неблокирующую функцию, возвращающую Future? Почему бы не положить эту функцию в обычный сервисный класс с понятным интерфейсом и не вызывать его напрямую?
в чем смысл создания актора для заполнения промисов, который внутри выполняет неблокирующую функцию, возвращающую Future? Почему бы не положить эту функцию в обычный сервисный класс с понятным интерфейсом и не вызывать его напрямую?Актор может быть нужен для хранения изменяющегося состояния и выполнения действий в зависимости от него. В примере с букингом из статьи это состояние — выполняется сейчас HTTP-запрос или нет. В то же время клиенты как раз и знают только про обычный сервисный класс
BookingClient с понятным интерфейсом.Из-за незнания постоянно пользовалсяКстати говоря, вonCompleteилиonSuccessметодами из akka-http.
GenericMarshallers есть полезные маршаллеры и для других стандартных типов (например, Option), которые часто удобно повторно использовать.Не знаю упоминалось ли в статье, но еще одна важная, на мой взгляд тема связанная с actor-ами и future: doc.akka.io/docs/akka/current/general/jmm.html#actors-and-shared-mutable-stateВ статье явно эта тема не затрагивалась, но именно по этой причине в акторе
HttpBookingClient.ClientActor обратное изменение функции поведения на default инициируется отправкой сообщения себе:p.future.onComplete(_ => self ! Completed)
Паттерн передачи scala.concurrent.Promise в актор: особенности использования и альтернативы