Есть ли способ в Scala для выполнения произвольного кода на удаленном узле с помощью RemoteActor? - PullRequest
4 голосов
/ 12 ноября 2010

Например, у меня есть доверенный клиент и сервер. Клиент хочет выполнить произвольный код на сервере. Можно ли это сделать с помощью RemoteActor (сериализовать функцию и отправить ее по сети, десериализовать и выполнить)?

Ответы [ 2 ]

4 голосов
/ 12 ноября 2010

Вот пример использования URLClassLoader с удаленными субъектами, для извлечения классов через http из клиента и выполнения общих вычисленийна сервере.

Вас также может заинтересовать Техника HotSwap , применяемая к сериализуемым Akka Actors .

3 голосов
/ 12 ноября 2010

В настоящее время нет.Сериализация функции означает сохранение ее полей в выходном потоке объекта, а десериализация - это чтение функционального объекта из входного потока объекта в другом месте.Десериализация предполагает, что класс объекта, читаемого из входного потока объекта, известен JVM.Помните - функции - это просто объекты за сценой.

В этом случае сервер не знает фактический конкретный класс объекта функции, который вы сериализуете, возможно, он реализует интерфейс Function.Для поддержки такой функциональности вам нужно найти файл класса рассматриваемой функции, отправить его на сервер и загрузить на сервер с помощью пользовательского загрузчика классов .Затем, если объект имеет какое-либо состояние, вы можете сериализовать объект на клиенте, отправить его по сети и десериализовать его на сервере.Только тогда вы сможете запустить его методы.Предполагая, что ваши функциональные объекты не сохраняют состояния, как это обычно бывает, вы можете пропустить этап сериализации / десериализации.

РЕДАКТИРОВАТЬ:

Помните также, что функции могут внутренне содержать ссылки на свои вызывающие среды,Это означает, что вы можете в конечном итоге сериализовать окружение функционального объекта вместе с ним, который потенциально может быть данными всей вашей программы.

...