Отвечать удаленному клиенту только через ответ? - PullRequest
0 голосов
/ 03 ноября 2011

Согласно документации актера можно ответить, используя self.channel ! Message, поэтому код будет работать локально.Я хотел бы сделать то же самое с удаленными актерами.

У меня есть:

class ServerActor extends Actor {
  def receive = {
    case "Hello" =>
      self.channel ! "World"
  }
}

и

class ClientActor extends Actor { 
   val remote = ...

   def receive = {
      case "Start" =>
           remote ! "Hello" 
      case "World" => 
           println("World received")
   }
}

Это работает, поскольку ServerActor получает "Hello" и отправляет сообщение "World"до ClientActor.К сожалению, похоже, что ClientActor, получающий сообщение, - это тот, который создан на виртуальной машине сервера, а не тот, который фактически отправил его (на клиентской виртуальной машине).

Есть ли способ заставить эту работу?

PS: Это работает, когда я делаю self reply "World" и remote ? "Hello", однако, я бы скорее отправил сообщение, чем ответил.

РЕДАКТИРОВАТЬ: Спасибо всем,Начало удаленного взаимодействия на обоих концах было проблемой.Другие считают, что этот вопрос остерегается: если вы разрешаете клиентам получать свои ответы неблокирующим образом (например, если вы не используете remote ? request), их немедленное отключение при получении сообщения о завершении работы вызывает странное поведение (упомянутое в моих комментариях ниже).);возможно, по замыслу (из-за отказоустойчивости Акки?).Так как клиенты не ждут ответа, их немедленное отключение при получении сообщения о завершении работы приведет к следующему (на akka-1.2): так как «исходных клиентов» больше не существует (но круговая передача «все еще выполняется»)) они перезагружаются - как ни странно - как на клиенте, так и на сервере.

1 Ответ

0 голосов
/ 04 ноября 2011

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

Исключение составляют случаи, когда вы явно запрашиваете результат с оператором вопросительного знака.

...