Исключение удаленного актера scala
Я со скала-кодом, как это для эхо-службы.
импорт scala.actors.Actor импорт scala.actors.Actor._ импорт scala.actors.remote.RemoteActor._
класс Echo расширяет Actor { def act() { живой (9010) зарегистрироваться ('myName, self) loop { реагировать { case msg => println (msg) } } } } object EchoServer { def main (args: Array [String]): unit = { val echo = новое эхо echo.start println("Эхо-сервер запущен") } } EchoServer.main(нуль)
но есть некоторые исключения.
java.lang.NoClassDefFoundError: Main $$ anon $ 1 $ Echo $$ anonfun $ act $ 1 at Main $$ anon $ 1 $ Echo.act ((виртуальный файл):16) в scala.actors.Reaction.run(Reaction.scala:76) на scala.actors.Actor$$anonfun$start$1.apply(Actor.scala:785) на scala.actors.Actor$$anonfun$start$1.apply(Actor.scala:783) на scala.actors.FJTaskScheduler2$$anon$1.run(FJTaskScheduler2.scala:160) at scala.actors.FJTask$Wrap.run(неизвестный источник) на scala.actors.FJTaskRunner.scanWhileIdling(неизвестный источник) на scala.actors.FJTaskRunner.run(неизвестный источник) Вызывается: java.lang.ClassNotFoundException: Main$$anon$1$Echo$$anonfun$act$1 на java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(собственный метод) на java.net.URLClassLoader.findClass(URLClassLoader.java:188) в java.lang.ClassLoader.loadClass(ClassLoader.java:307) в java.lang.ClassLoader.loadClass(ClassLoader.java:252) в java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) ... еще 8
я не знаю, как это может быть причиной. Кстати. Моя версия Scala является 2.7.5
2 ответа
ClassNotFoundException
указывает, что что-то, вероятно, не было скомпилировано, что должно было быть скомпилировано. Как вы это скомпилировали? Используя вручную scalac
?
Попробуйте следующее rm *.class
scalac *.scala
scala EchoServer
,
Следующие работы:
EchoServer.scala
import scala.actors.Actor
import scala.actors.Actor._
import scala.actors.remote.RemoteActor._
class Echo extends Actor {
def act() {
alive(9010)
register('myName, self)
loop {
react {
case msg => println(msg)
}
}
}
}
object EchoServer {
def main(args: Array[String]): unit = {
val echo = new Echo
echo.start
println("Echo server started")
}
}
Client.scala
import scala.actors.Actor._
import scala.actors.remote.Node
import scala.actors.remote.RemoteActor._
object Client extends Application {
override def main(args: Array[String]) {
if (args.length < 1) {
println("Usage: scala Client [msg]")
return
}
actor {
val remoteActor = select(Node("localhost", 9010), 'myName)
remoteActor !? args(0) match {
case msg => println( "Server's response is [" + msg + "]" )
}
}
}
}
Командная строка:
rm *.class && scalac *.scala && scala EchoServer
И в другом терминале:
scala Client hello
Вам нужно установить загрузчик классов на удаленных актерах.
Перед act()
метод, добавьте строку:
RemoteActor.classLoader = getClass.getClassLoader
Почему настройка загрузчика классов необходима с помощью Scala RemoteActors?