2010-11-12 4 views
4

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

ответ

3

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

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

EDIT:

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

+0

Но сериализация сохранит только значения поля функции в потоке. Переопределение метода apply применяется для анонимного класса, реализующего интерфейс 'Function'. Фактический код в переопределенном методе 'apply' анонимного класса не становится сериализованным, если мое понимание верное. Правильно? В этом случае, как удаленный актер на сервере узнает о теле метода «apply», который известен только на клиенте? – axel22

+1

Согласны, нашли тему по этой теме: http://scala-programming-language.1934581.n4.nabble.com/Passing-functions-to-remote-actor-td2991157.html –

4

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

Вы также можете быть заинтересованы в HotSwap technique применительно к serializable Akka Actors.