scala akka: есть ли у актера вспомнить что-то, на что он должен в конечном итоге ответить? - PullRequest
4 голосов
/ 04 июля 2011

в akka предположим, что существует линейная цепочка действующих лиц, так что каждый действующий субъект получает сообщение из восходящего потока, отправляет свое собственное сообщение в нисходящем направлении и ожидает ответа, а затем отправляет сообщение обратно в восходящем направлении. как актер может вспомнить дескриптор вышестоящего актера, когда он должен ответить этому актеру позже?

например:

A sends message to B (b ! "msg1")
B sends message to C (c ! "msg2")
C replies to B (self.reply ! "msg3")
B replies to A <--- ???

в принципе, как B может запомнить дескриптор для A? выполнение self.reply на этом этапе относится к C, так как C отправил текущее сообщение на B.

1 Ответ

6 голосов
/ 04 июля 2011

Актер должен B изменить ответное сообщение между C и A ?

  1. Если нет, актер B должен использовать B forward "msg" вместо B ! "msg". Это сохранит информацию об отправителе. Когда C использует ответ, ответ автоматически отправляется на A без прохождения B:

    A sends message to B (b ! "msg")

    B forward the message to C (c forward "msg")

    C replies to A (self.reply ! "msg3")

  2. Если да, найдите отправителя ActorRef и передайте его вместе с отправителем сообщения.

Например, используя простой кортеж:

A sends message to B (b ! "msg1")
B sends message to C, with the sender reference (c ! ("msg2",self.sender) )
C replies to B adding the reference it received (self.reply ! ("msg3",ref) )
B replies to A ( ref ! "msg4" )

Здесь я использовал кортеж, но если у вас более длинная цепь, пропустите List[ActorRef]. При переходе вперёд вы должны указать отправителей. И когда вы возвращаетесь, вы отвечаете на заголовок списка и пропускаете хвост списка вдоль ответа.

Редактировать: Принимая во внимание комментарий Виктора.

...