Как обрабатывать сообщения только от дочерних актеров?
Я создал FSM Akka, который порождает двух дочерних акторов в своем конструкторе и получает сообщения только от одного из них.
val lhsRef: ActorRef = context.actorOf(Props(new PrimitiveNode(tpe)), "lhs")
val rhsRef: ActorRef = context.actorOf(Props(new PrimitiveNode(tpe)), "rhs")
Имея дело с входящими событиями, я хочу фильтровать для тех, которые приходят lhsNode
, Я попытался добиться этого следующим образом:
when(WaitFor1) {
case Event(event: SomeEventType, _) =>
// Control flow reaches this point but...
if (sender == lhsRef) {
// ...it never enters the if clause.
Это не работает. По факту, sender
а также lhsNode
не равны, хотя это определенно lhsNode
который отправляет сообщения на мой FSM.
sender() Actor[akka://default/user/$a#670517729]
lhsNode Actor[akka://default/user/$a/$a/$b/lhs#-354253348]
Что я делаю неправильно?
1 ответ
Решение
Сравните только имена sender
а также lhs
, Проверьте, действительно ли сообщение отправлено lhsNode
,
sender.path.name == "lhs"
или же
sender.path.name = lhsNode.path.name
Убедитесь, что sender
это lhs
только актер. forward
сообщение, если между ними участвует какой-либо другой актер.
Что-то вроде ниже
when(WaitFor1) {
case Event(event: SomeEventType, _) =>
// ...
if (sender.path.name == "lhs") {
// ....
с паттерном охранника
when(WaitFor1) {
case Event(event: SomeEventType, _) (if sender.path.name == "lhs") =>