/ / can akka actor przechwytuje określoną wiadomość we wszystkich stanach bez implementacji tego samego kodu - scala, akka

może akka aktor przechwytuje określoną wiadomość we wszystkich stanach bez implementacji tego samego kodu - scala, akka

Mam aktora, który zarządza różnymi stanami, np .:

case object Start
case object Stop
case object Init

class Foo extends Actor {

def receive: Receive = {
case Init =>
doSomeInit()
context become busy
self ! Start
case Stop =>
context stop self

}
}
def busy: Receive = {
case Start =>
doingSomeProcessing()
context become receive
case Stop =>
context stop self
}
}

Chcę uniknąć pisania kodu obsługi zatrzymania w każdym stanie (podobnie jak w przypadku braku obsługi w FSM) czy istnieje idiomatyczny sposób na to, bez korzystania z FSM?

Odpowiedzi:

5 dla odpowiedzi № 1

Posługiwać się orElse i przenieś typowe komunikaty do oddzielnej częściowej funkcji. receive i busy są częściowymi funkcjami. Możesz komponować funkcje częściowe za pomocą orElse jak pokazano w poniższym kodzie.

Zamówienie jest ważne. Tak więc w oparciu o przypadek użycia f1 orElse f2 lub f2 orElse f1 f1, f2 są częściowymi funkcjami

case object Start
case object Stop
case object Init

class Foo extends Actor {

def common: Receive = {
case Stop =>
context stop self
}

def receive: Receive = common orElse {
case Init =>
context become busy
self ! Start
}

def busy: Receive = common orElse {
case Start =>
context become receive
}
}

Scala REPL

scala> val f: PartialFunction[Int, String] = { case 1 => "one"}
f: PartialFunction[Int, String] = <function1>
scala> val g: PartialFunction[Int, String] = { case 2 => "two"}
g: PartialFunction[Int, String] = <function1>
scala> val x = f orElse g
scala> f(1)
res9: String = "one"
scala> x(2)
res10: String = "two"
scala> x(1)
res11: String = "one"