Почему настройка загрузчика классов необходима с помощью Scala RemoteActors?
При использовании Scala RemoteActors я получал ClassNotFoundException, который ссылался на scala.actors.remote.NetKernel. Я скопировал чужой пример и добавил RemoteActor.classLoader = getClass.getClassLoader
моему актеру и теперь все работает. Почему это необходимо?
1 ответ
Удаленные субъекты используют сериализацию 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, вы должны убедиться, что вы установили это значение на загрузчик классов, который имеет доступ ко всем классам, используемым всеми сериализованными субъектами.
Надеюсь, это поможет!