5

Scala RemoteActors を使用すると、scala.actors.remote.NetKernel を参照する ClassNotFoundException が発生しました。他の人の例をコピーRemoteActor.classLoader = getClass.getClassLoaderして自分のアクターに追加したところ、すべてが機能するようになりました。なぜこれが必要なのですか?

4

1 に答える 1

5

リモート アクターは、Java シリアライゼーションを使用してメッセージを送受信します。アクター ライブラリ内には、カスタム オブジェクト入力ストリーム ( https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src/actors/scala/actors/remote/JavaSerializer.scala ) があります。ソケットとの間でオブジェクトをシリアル化するために使用されます。いくつかのルーティング コードとその他の魔法もあります。

いずれにせよ、リモーティングに使用される ClassLoader はかなり重要です。Java RMI に慣れていない場合は、Java RMI を調べることをお勧めします。いずれにせよ、アクターをシリアライズ/デシリアライズするときに Scala が選択する ClassLoader は、デフォルトで null に設定されている RemoteActor にあるものです。

これは、デフォルトでは、ClassLoader を指定しないと満足できないことを意味します;)。

OSGi などのクラスローダーを制御する環境にいる場合は、すべてのシリアライズされたアクターが使用するすべてのクラスにアクセスできるクラスローダーにこの値を設定する必要があります。

それが役立つことを願っています!

于 2010-08-23T14:02:27.293 に答える