2016-08-14 1 views
0

Надеюсь, это нормально спросить об этом. Я использую акку и имею двух актеров, где один инициируется/создается быстро, а другой намного медленнее. Быстро созданный спрашивает другого о чем-то (ask-pattern), и сообщение отправляется мертвым буквам, так как другое еще не инициировано. Каков предпочтительный способ заставить актера ждать отправки его сообщения? Я не очень хочу сделать актера сном или чем-то, не зная, что другого пути нет.Как избежать отправки сообщений актерам, которые еще не созданы?

ответ

1

Я бы использовал функциональность become()/unbecome() Акка для Актеров. Я предполагаю в следующем коде, что slowActor создается fastActor. Фокус здесь в том, что fastActor будет иметь два типа поведения: один, когда начинается slowActor, а другой - когда он готов выполнить какую-то работу. Когда slowActor будет готов, он отправит сообщение fastActor на рекламу, способную принимать сообщения. fastActor будет watch ing slowActor, и если он будет разорван, он снова изменит свое поведение. Что делать дальше, это зависит от вашего решения.

Вот макет код в качестве руководства (я не компилируется код и он может содержать некоторые ошибки):

case object Ready 
case object DoWork 
case object WorkDone 

class FastActor extends Actor with ActorLogging { 

    val slowActor = context.actorOf(SlowActor.props) 
    context.watch(slowActor) 

    def receive = slowActorNotReadyBehavior 

    def slowActorNotReadyBehavior = { 
     case DoWork => log.warning("Slow actor in not ready, I am sorry...") 
     case Ready => context.become(slowActorReadyBehavior) 
    } 

    def slowActorReadyBehavior = { 
     case DoWork => (slowActor ? DoWork).pipeTo(self) 
     case Terminated(ref) => 
      log.error("Slow actor terminated") 
      context.unbecome() 
      //... do something with slowActor 
    } 
} 

class SlowActor extends Actor { 

    override def preStart = { 
     context.parent ! Ready 
    } 

    def receive = { 
     case DoWork => 
      //do something 
      sender ! WorkDone 
    } 
} 
+0

спасибо. Это может быть интересно, но медленный актер сейчас является братом быстрого актера. – stian

Смежные вопросы