Проблема создания Akka ActorSystem - PullRequest
2 голосов
/ 17 февраля 2012

Мы используем Akka 2.0 RC1 и получаем исключение при создании ActorSystem с сообщением: akka.actor.LocalActorRefProvider и трассировкой стека следующим образом:

java.net.URLClassLoader$1.run(URLClassLoader.java:366)
java.net.URLClassLoader$1.run(URLClassLoader.java:355)
java.security.AccessController.doPrivileged(AccessController.java:279)
java.security.AccessController.doPrivileged(AccessController.java:520)
java.net.URLClassLoader.findClass(URLClassLoader.java:354)
java.lang.ClassLoader.loadClass(ClassLoader.java:450)
sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
java.lang.ClassLoader.loadClass(ClassLoader.java:385)
akka.actor.ReflectiveDynamicAccess.getClassFor(DynamicAccess.scala:94)
akka.actor.ReflectiveDynamicAccess.createInstanceFor(DynamicAccess.scala:102)
akka.actor.ActorSystemImpl.<init>(ActorSystem.scala:439)
akka.actor.ActorSystem$.apply(ActorSystem.scala:41)
akka.actor.ActorSystem$.apply(ActorSystem.scala:51)
kozo.excel.impl.ConnectClient.<init>(ConnectClient.scala:26)

Исключение возникает в этой строке:

system = ActorSystem("FunctionClient")

Есть мысли или идеи?Мы подтвердили, что LocalActorRefProvider был в пути к классам.

1 Ответ

4 голосов
/ 17 февраля 2012

Было бы полезно, если бы вы добавили фактическое сообщение об исключении в свой вопрос, но я пойду здесь в конце и предположу, что это сообщение об ошибке, как проиллюстрировано в этой теме :

java.lang.ClassCastException: interface akka.actor.ActorRefProvider is
not assignable from class akka.actor.LocalActorRefProvider 

Он работает нормально и для меня, когда я запускаю его под консолью через sbt, как вы описываете. Однако, если я запускаю его с помощью:

scala -classpath

и импортировать и выполнить, я получаю ошибку, которую я упомянул.

Причина:

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

Предложение:

Каждая строка в реплике работает в отдельном потоке.
Если вы добавите параметр -Yrepl-sync, он будет работать нормально

...