Как обрабатывать сообщения только от дочерних актеров?

Я создал 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") =>
Другие вопросы по тегам