6

これが私が見つけたものであり、私の人生では理由にナビゲートできません。基本的に何もしないか、受信したメッセージのタイプに基づいてメッセージを印刷する「プリンター」アクターを作成しています。

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

これらのアクターはローカルであることを強調する価値があります。私はactorForが減価償却されていることについて何か読んだことがあります. ただし、ここには非常に多くの可動部分があり、安定した包括的なドキュメントはあまりありません。どんな助けでも大歓迎です。

4

3 に答える 3

8

ここに表示されているのは、DeathWatchNotifications が処理されていないことです。つまり、アクター (ルーター) が終了したときにまだその子を監視していたことを意味します。記載されているように、これは自動的に問題の兆候ではありません(ただし、この特定のメッセージの場合は、より明確にする必要があります)。この場合、このメッセージを取り除く唯一の方法は、ルーターとルートが「同時に」終了しないようにすることです。

于 2013-09-24T06:33:55.487 に答える
3

akka プロジェクトで同じ問題に遭遇しました。AKKAリモート アクターの実行中に「デッド レターが発生しました」というエラーが発生しました。

通常、デッド レターは、マスターから送信されたメッセージを受信するワーカー アクターがなくなったときに発生します。マスターがタスクまたはメッセージをワーカー アクターに送信するときは、ワーカー アクターが生きていることを確認する必要があります。

于 2013-09-24T00:48:15.223 に答える
1

1 つの解決策は、 Schedulerを使用することです。

context.stop(self)

使用する:

system.scheduler.scheduleOnce(1 second) {
  self ! PoisonPill
}
于 2014-04-28T06:38:14.003 に答える