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