Можно ли использовать сообщения с блокирующими субъектами, если они упакованы в будущее?

Мое текущее приложение основано на akka 1.1. Он имеет несколько ProjectAnalysisActors , каждый из которых отвечает за выполнение аналитических задач для конкретного проекта. Анализ начинается, когда такой субъект получает общее стартовое сообщение. После завершения одного шага он отправляет себе сообщение со следующим шагом, если он определен. Выполняемый код в основном выглядит следующим образом


sealed trait AnalysisEvent {
   def run(project: Project): Future[Any]
   def nextStep: AnalysisEvent = null
}

case class StartAnalysis() extends AnalysisEvent {
   override def run ...
   override def nextStep: AnalysisEvent = new FirstStep
}

case class FirstStep() extends AnalysisEvent {
   override def run ...
   override def nextStep: AnalysisEvent = new SecondStep
}

case class SecondStep() extends AnalysisEvent {
   ...
}

class ProjectAnalysisActor(project: Project) extends Actor {

    def receive = {
        case event: AnalysisEvent =>
            val future = event.run(project)
            future.onComplete { f =>
                self ! event.nextStep
            }
    }

}

. У меня есть некоторые трудности, как реализовать свой код для методов выполнения для каждого шага анализа. На данный момент я создаю новое будущее внутри каждого метода запуска. В этом будущем я отправляю все последующие сообщения в разные подсистемы. Некоторые из них представляют собой неблокирующие сообщения типа «запустил и забыл», но некоторые из них возвращают результат, который следует сохранить до начала следующего шага анализа.

На данный момент типичный метод выполнения выглядит следующим образом


def run(project: Project): Future[Any] = {
    Future {
        progressActor ! typicalFireAndForget(project.name)
        val calcResult = (calcActor1 !! doCalcMessage(project)).getOrElse(...)

        val p: Project = ... // created updated project using calcResult

        val result = (storage !! updateProjectInformation(p)).getOrElse(...)
        result
    }
}

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

6
задан Steffen 13 July 2011 в 13:33
поделиться