Почему настройка загрузчика классов необходима с помощью Scala RemoteActors? - PullRequest
5 голосов
/ 22 августа 2010

При использовании Scala RemoteActors я получал исключение ClassNotFoundException, ссылающееся на scala.actors.remote.NetKernel.Я скопировал чужой пример и добавил RemoteActor.classLoader = getClass.getClassLoader к своему актеру, и теперь все работает.Зачем это нужно?

1 Ответ

5 голосов
/ 23 августа 2010

Удаленные субъекты используют сериализацию Java для отправки сообщений туда и обратно. Внутри библиотеки актеров вы найдете пользовательский поток ввода объектов (https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src/actors/scala/actors/remote/JavaSerializer.scala), который используется для сериализации объектов в / из сокета. Также есть некоторый код маршрутизации и другая магия.

В любом случае, ClassLoader, используемый для удаленного взаимодействия, довольно важен. Я бы порекомендовал поискать Java RMI, если вы не знакомы с ним. В любом случае, ClassLoader, который Scala выбирает при сериализации / десериализации актеров, это объект, расположенный на RemoteActor, который по умолчанию равен нулю.

Это означает, что по умолчанию вы будете недовольны без указания ClassLoader;).

Если вы находитесь в среде, которая контролирует загрузчики классов, например OSGi, вам нужно убедиться, что вы установили это значение на загрузчик классов, который имеет доступ ко всем классам, используемым всеми сериализованными актерами.

Надеюсь, это поможет!

...