2016-05-16 5 views
3

Akkaのドキュメントによれば、メールボックスはメッセージのためにスキャンされません。各メッセージは到着順に別のメッセージ(デフォルトではFIFO)後に処理されます。しかし、アクターから受信者に一致しないメッセージをアクターから別のアクターに送信すると、デッドレターアクター(これは想定されるログに表示される)に移動されたり、メールボックス内の次のメッセージの処理がブロックされたりしません1秒後に到着し、正しく処理することができます。Akkaと比類のないメッセージはどうなりますか?

メールボックスからの不一致のメッセージはどうなりますか?

私はsbtでScala 2.10.4とAkka 2.4-SNAPSHOTを使用しています。

package main.scala 

import akka.actor._ 

class SRActor(dest: ActorRef) extends Actor with ActorLogging { 
    dest ! A 
    dest ! B 

    context.stop(self) 

    override def receive = { 
    case _ => { 
     log.info("Finally got something") 
    } 
    } 
} 

class SRActorReceiver extends Actor with ActorLogging { 
    override def receive = { 
    case B => 
     log.info("Finally got B") 
    } 
} 

俳優の作成:

package main.scala 

import akka.actor._ 
case object A 
case object B 

object ErrorApp extends App { 
// SR: Send nowhere received 
    var system6 = ActorSystem("ErrorActorSystem") 
    val srActorReceiver = system6.actorOf(Props(classOf[SRActorReceiver]), "sractorreceiver") 
    val sractor = system6.actorOf(Props(classOf[SRActor], srActorReceiver), "sractor") 

    // wait until actors have finished 
    Thread.sleep(1000) 

    system6.shutdown 

答えて

3

は、アッカの俳優受信メッセージループが網羅されていることに注意してくださいdocs

からアーランと後半Scalaのアクターに比べて異なっている をコピーし。この は、 が受け入れることができるすべてのメッセージに対してパターンマッチを提供する必要があることを意味し、未知のメッセージを処理できるようにしたい場合は、上記の例のようにデフォルトの場合が必要です。 それ以外の場合は、akka.actor.UnhandledMessage(メッセージ、送信者、受信者) がActorSystemのEventStreamに公開されます。

またActorにはunhandledの方法があります。 (docs

def unhandled(message: Any): Unit

ユーザーオーバーライドコールバック。

デフォルトでアクターの現在の動作によってメッセージが処理されないときは、akka.actor.DeathPactException(処理されていないakka.actor.Terminatedメッセージの場合)またはakkaを発行してメッセージが失敗します。 actor.UnhandledMessageを俳優のシステムのakka.event.EventStream

関連する問題