Как отправить отложенный ответ внутри актера Scala - PullRequest
1 голос
/ 22 апреля 2011

Неакторный класс отправляет синхронное сообщение актеру, например, так:


val response = WorkData !? "hello"

Если я хочу ответить на это сообщение сразу, то я сделаю это:


receive {
  case "hello" => reply("world")
}

Но если мне нужно будет ответить некоторое время в будущем, то как мне сохранить ссылку на вызывающего абонента и отправить ответ после этого?

Ответы [ 3 ]

4 голосов
/ 22 апреля 2011

Обычно я сохраняю ссылку на отправителя, чтобы использовать ее позже.

receive {
  case "hello" => 
    val otherParty = sender
    // more receives, etc
    // ...
    otherParty ! "world"   
}
4 голосов
/ 22 апреля 2011

Ссылка на текущего абонента хранится в sender. Например, вполне допустимо заменить

receive {
  case "hello" => reply("world")
}

с

receive {
  case "hello" => sender ! "world"
}

В дальнейшем вы можете сохранить эту ссылку в изменяемой переменной или рекурсивно пропустить цикл актера.

1 голос
/ 22 апреля 2011

Как насчет создания анонимного актера, который обрабатывает сообщение и отвечает, когда он готов?Таким образом, получатель просто действует как диспетчер.Это не требует изменяемой переменной для хранения чего-либо, так как вы используете здесь замыкание.

import scala.actors.Actor                                                              
import scala.actors.Actor._

case class Message(msg: String)

class MyReceiver extends Actor {
  def act() {
    react {
      case Message(msg) =>
        actor {
          sender ! process(msg)
        }   
    }   
  }

  def process(msg: String): String =
    "Result: " + msg 
}

object Main {
  def main(args: Array[String]) {
    val a = new MyReceiver
    a.start()

    val res = a !? Message("foo")
    println(res)
  }
}

С уважением, raichoo

...