Как фьючерсы исполняются в актере Akka - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь сделать фоновую задачу, которая выполняет сетевой вызов и сохраняет ответ в базе данных. Согласно документации , фоновые задачи должны использовать планировщик в системе акторов Akka. Мне нужно запустить будущее внутри этого актера:

    actorSystem.scheduler.scheduleOnce(delay = new FiniteDuration(0, TimeUnit.SECONDS)) {
        val future = network.request()
        future.flatMap(saveToDatabase(_))
    }

Поэтому у меня два вопроса:

  1. Это будущее гарантированно будет исполнено (до завершения)?
  2. Возможно ли, чтобы другие запросы отслеживали состояние этой задачи (независимо от того, завершена она или нет)?

1 Ответ

0 голосов
/ 14 сентября 2018

Future в значении future возвращается объектом network, поэтому этот объект отвечает за выполнение кода, запускающего Future, а не Akka. Поэтому вам нужно просмотреть документацию для вызова request, чтобы узнать, какие гарантии завершения есть для этого Future.

Future, возвращаемый вызовом flatMap, использует контекст выполнения по умолчанию, который находится в области действия при создании этой задачи. Но вызов saveToDatabase гарантированно не будет вызван, потому что Future может дать сбой, а flatMap вызывается только при успехе.

Если вы хотите отслеживать состояние этой задачи, отправляйте сообщения субъекту мониторинга в различные моменты выполнения. Затем другие участники могут спросить этого участника мониторинга о ходе выполнения задачи.

...