Отвечаете удаленному клиенту только через ответ?

Согласно документации по актору akka, можно ответить, используя 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 "let-it-fail"?). Поскольку клиенты не ждут ответа, их немедленное отключение при получении сообщения о завершении работы приведет к следующему (на akka-1.2): поскольку «исходные клиенты» больше не существуют (но круговой обход «все еще продолжается» ) они перезапускаются - как ни странно - и на клиенте, и на сервере.


person subsub    schedule 03.11.2011    source источник
comment
Это определенно поможет мне, если вы укажете, какую версию вы используете. Вы начали удаленное взаимодействие как на клиенте, так и на сервере?   -  person Viktor Klang    schedule 03.11.2011
comment
@VictorKlang: Конечно, это akka-1.2. Что вы подразумеваете под удаленным взаимодействием на обоих? Я делаю только Actor.remote.start(...) и register на сервере. Клиент вызывает только Actor.remote.actorFor(...).   -  person subsub    schedule 04.11.2011
comment
Вам также необходимо запустить удаленное управление на клиенте.   -  person Viktor Klang    schedule 04.11.2011
comment
@ViktorKlang: спасибо. Теперь я могу получить ответы в большинстве случаев. Иногда (после нескольких 1000 вызовов от нескольких клиентов) serverVM начинает бросать ClassNotFoundExceptions в _2 _... (эта ошибка связана с тем, что я использую независимые кодовые базы [и пути к классам] для клиента и сервера, поэтому нет способ для сервера найти класс клиента) ... что, я думаю, означает, что сервер пытается (повторно?) запустить клиент-актор на клиентской виртуальной машине.   -  person subsub    schedule 07.11.2011
comment
Здорово. Я рекомендую отключить сжатие в удаленном режиме, так как у нас с ним возникли некоторые проблемы. Кроме того, увеличение времени ожидания чтения для клиента может быть интересно с точки зрения производительности. Оба эти совета будут реализованы по умолчанию в 1.3.   -  person Viktor Klang    schedule 07.11.2011


Ответы (1)


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

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

person Gamlor    schedule 04.11.2011