Итак, этот вопрос связан с моим старым вопросом: Нужно ли мне повторно использовать одну и ту же Akka ActorSystem или я могу просто создавать ее каждый раз, когда она мне нужна?
Я задал вопрос о жизненном цикле актеров и понял, что у меня что-то не так, но не смог правильно сформулировать. Надеюсь теперь смогу :-).
Вот ситуация. Я хочу протестировать актеров, которые имеют зависимости от других компонентов и актеров, поэтому я начал создавать свои актеры во время начальной загрузки (я использую scalatra, но вы, тем не менее, загружаете свое приложение). Поэтому у меня есть что-то вроде этого:
trait DependencyComponent
{
val dependency : Dependency
}
trait ActorComponentA extends Actor with DependencyComponent {
val actorB : ActorRef
}
trait ActorComponentB extends Actor with DependencyComponent
Итак, теперь я могу протестировать своих актеров, расширив трейты и предоставив фиктивные зависимости, все хорошо. И я могу загрузить свое приложение так:
Начальная загрузка
val system = ActorSystem()
val actorA = system.actorOf(Props[DefaultActorA])
class DefaultActorB extends ActorComponentB {
val dependency = new RealDependency()
}
class DefaultActorA extends ActorComponentA {
val dependency = new RealDependency()
val actorB = context.actorOf(Props[DefaultActorB]).withRouter(RoundRobinRouter(nrOfInstances = 100)))
}
Круто, я счастлив :-), теперь я могу использовать акторную систему и акторА в своем приложении, и у него есть 100 акторБ, перенаправляемых для передачи работы. Поэтому, когда актор А решает, что работа сделана, насколько я понимаю, он должен передать маршрутизируемым акторам сообщение об отключении. В этот момент, когда приходит другой запрос, актор A больше не может отправлять сообщения маршрутизатору, потому что все его акторы мертвы.
Если бы я не устанавливал это во время загрузки, то actA и его зависимости могли бы создаваться при необходимости в моем приложении. Но это очень похоже на «обновление объекта» в мире DI. Чтобы проверить, я в конечном итоге переопределял места, где были созданы актеры.
Документы Scalatra предлагают создавать моих актеров во время загрузки, поэтому я чувствую, что здесь что-то упускаю. Любая помощь приветствуется.
Здоровья, Крис.
РЕДАКТИРОВАТЬ
Я поставил +1 и @futurechimp, и @cmbaxter, поскольку они оба кажутся действительными, но немного противоречат друг другу. Так что это открытый комментарий для вас обоих.
Итак, @cmbaxter, я прав, думая, что вы предлагаете никогда не вызывать «стоп» для маршрутизируемых акторов и просто поддерживать их пул для использования ВСЕМИ запросами. И @futurechimp, вы предлагаете, чтобы сервлет создавал экземпляры актеров по запросу и убивал их в конце жизненного цикла. Верно?
Похоже, что каждый запрос будет создавать больше актеров (но избавляться от них). Если опрос будет иметь только ограниченный набор для всех запросов, и в этом случае есть потенциальное узкое место для этого подхода?
Я думаю, в основном, я спрашиваю, верны ли мои предположения, и если да, то каковы преимущества и недостатки обоих подходов?