2013-09-24 3 views
5

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

class Printer extends Actor { 
    def receive = { 
     case m: SomeMessage => println(m.text) 
     case _ => 
    } 
} 

Я создаю несколько из этих актеров:

val actor4 = system.actorOf(Props[Printer], "t-4") 
val actor5 = system.actorOf(Props[Printer], "t-5") 
val actor6 = system.actorOf(Props[Printer], "t-6") 

и бросали их в вектор:

val routees2 = Vector[ActorRef](actor4, actor5, actor6) 

я делаю выше, так что я могу бросить их в маршрутизатор (и они будут находиться под контролем маршрутизатора). Когда я запускаю спецификацию до этого момента, у меня нет никаких проблем. Как только я помещаю их в маршрутизатор и запускаю спецификацию, у меня возникают проблемы. Вот маршрутизатор:

val router = system.actorOf(Props[Printer].withRouter(
    BroadcastRouter(routees = routees2)), "router-to-transformers") 

Теперь, когда я бегу спецификации у меня есть все виды мертвых букв ...

[INFO] [09/23/2013 17:10:21.468] [spider-akka.actor.default-dispatcher-6] [akka://spider/user/router-to-transformers] Message [akka.dispatch.sysmsg.DeathWatchNotification] from Actor[akka://spider/user/router-to-transformers#-1845250548] to Actor[akka://spider/user/rout 
er-to-transformers#-1845250548] was not delivered. [1] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'. 
[INFO] [09/23/2013 17:10:21.468] [spider-akka.actor.default-dispatcher-6] [akka://spider/user/router-to-transformers] Message [akka.dispatch.sysmsg.DeathWatchNotification] from Actor[akka://spider/user/router-to-transformers#-1845250548] to Actor[akka://spider/user/rout 
er-to-transformers#-1845250548] was not delivered. [2] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'. 
[INFO] [09/23/2013 17:10:21.468] [spider-akka.actor.default-dispatcher-6] [akka://spider/user/router-to-transformers] Message [akka.dispatch.sysmsg.DeathWatchNotification] from Actor[akka://spider/user/router-to-transformers#-1845250548] to Actor[akka://spider/user/rout 
er-to-transformers#-1845250548] was not delivered. [3] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'. 

Для жизни меня я не могу понять, что происходит здесь , Я добавил ссылку на фрагмент теста. Нумерация, в фрагменте, странна, потому что я разрезал кучу различных попыток, которые были прокомментированы, чтобы не загромождать фрагмент. Я сосредоточен на этом вопросе о мертвых письмах, потому что чувствую, что, когда я добавил больше актеров и фактически начал передавать сообщения, вещи не доставлялись ... http://snipt.org/AhVf0

Стоит напомнить, что эти актеры местный. Я читал что-то о актере. Для того, чтобы быть обесцененным, и мне интересно, если это используется, и отчасти это вызывает мои проблемы? Здесь очень много движущихся частей, а не много стабильной, полной, документации. Любая помощь будет принята с благодарностью.

ответ

7

Что вы видите здесь, так это то, что функции DeathWatchNotifications не обрабатываются, что означает, что актер (Маршрутизатор) все еще смотрел на своих детей, когда он был завершен. Это не является признаком ошибки as documented (но мы должны сделать это более ясным в случае данного сообщения). В этом случае единственный способ избавиться от этого сообщения - убедиться, что маршрутизатор и маршруты не прекращаются «в одно и то же время».

+1

Вместо использования: 'вал маршрутизатора = system.actorOf (реквизит (CreateDiagnostic) .withRouter (BroadcastRouter (routees = routees2)), «router») 'синтаксис, на который я переключился: val router = system.actorOf (Props (createDiagnostic) .withRouter (BroadcastRouter (nrOfInstances = 3)),« router »), который сделал мертвым -товары уходят. Я предполагаю, что эта вторая реализация - более чистый способ сделать это? Как всегда, спасибо. – MCP

3

Я столкнулся с той же проблемой с моим проектом akka. Вот мой вопрос "Dead Letters encountered" error while running AKKA remote actors

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

1

Одно из решений состоит в использовании Scheduler, и вместо

context.stop(self) 

Использование:

system.scheduler.scheduleOnce(1 second) { 
    self ! PoisonPill 
} 
Смежные вопросы