Исключение удаленного актера 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 *.classscalac *.scalascala 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?

Другие вопросы по тегам