Согласно документации по актору 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): поскольку «исходные клиенты» больше не существуют (но круговой обход «все еще продолжается» ) они перезапускаются - как ни странно - и на клиенте, и на сервере.
Actor.remote.start(...)
иregister
на сервере. Клиент вызывает толькоActor.remote.actorFor(...)
. - person subsub   schedule 04.11.2011ClassNotFoundException
s в _2 _... (эта ошибка связана с тем, что я использую независимые кодовые базы [и пути к классам] для клиента и сервера, поэтому нет способ для сервера найти класс клиента) ... что, я думаю, означает, что сервер пытается (повторно?) запустить клиент-актор на клиентской виртуальной машине. - person subsub   schedule 07.11.2011