2015-06-23 3 views
0

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

Я использовал:

self.tell(PoisonPill, self) 

и:

context.stop(self) 

, чтобы попытаться уничтожить актеров. Есть идеи?

Редактировать: Вот немного больше, чтобы отразить то, что я пытаюсь сделать. Программа открывается и порождает десять актеров.

val system = ActorSystem("system") 
(1 to 10) foreach { x => 
    Entity.count += 1 
    system.actorOf(Props[Entity], name = Entity.count.toString()) 
} 

Вот код для лица:

class Entity() extends Actor { 
    Entity.entities += this 
    val id = Entity.count 
    import context.dispatcher 
    val tick = context.system.scheduler.schedule(0 millis, 100 millis, self, "update") 
    def receive = { 
    case "update" => { 
     Entity.entities.foreach(that => collide(that)) 
    } 
    } 
    override def postStop() = tick.cancel() 
    def collide(that:Entity) { 
    if (!this.isBetterThan(that)) { 
     destroyMe() 
     spawnNew() 
    }   
    } 
    def isBetterThan() :Boolean = { 
    //computationally intensive logic 
    } 
    private def destroyMe(){ 
    Entity.entities.remove(Entity.entities.indexOf(this)) 
    self.tell(PoisonPill, self) 
    //context.stop(self) 
    } 
    private def spawnNew(){ 
    val system = ActorSystem("system") 
    Entity.count += 1 
    system.actorOf(Props[Entity], name = Entity.count.toString()) 
    } 
} 
object Entity { 
    val entities = new ListBuffer[Entity]() 
    var count = 0 
} 
+0

Можете ли вы показать больше кода о том, где вы создаете актера и как остановить актера? эти актеры обрабатывают что-то бесконечно? – 757071

+0

Помните, что недостаточно отправить актера PoisonPill; актер должен прожевать все сообщения, которые ему предшествовали. В тот момент, когда сообщение PoisonPill действительно будет отправлено, актер убит. – AmigoNico

+0

http://letitcrash.com/post/30165507578/shutdown-patterns-in-akka-2 – AmigoNico

ответ

0

Благодаря @AmigoNico, ты указал мне в правильном направлении. Оказывается, что ни

self.tell(PoisonPill, self) 

ни

context.stop(self) 

работал для своевременного удаления Actor; Я переключил линию на:

system.stop(self) 

и все работает должным образом.

+2

Нет никакой разницы между двумя последними возможностями, поэтому ваше наблюдение ошибочно. –

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