0

外部 jar からアクターを動的にロードし、そのアクターを ActorSystem に起動しようとしています。アクターをロードするためのプラグイン スタイルのアーキテクチャが必要です。これまでのところ、次のコードを試しています。

val loader = new URLClassLoader(Array(new URL("file:///<path>/plugin.jar")))
val clazz = loader.loadClass("d2e.Inst").asInstanceOf[Class[Actor]]

この部分は問題なく動作しますが、ActorSystem を起動して新しいアクターを起動しようとすると、次のようになります。

val system = ActorSystem.create("mysys")
val actor = system.actorOf(Props(clazz), "myactor")

次の例外が発生します。

akka.ConfigurationException: configuration problem while creating
...
Caused by: java.lang.IllegalArgumentException: unknown actor creator [class d2e.Inst]
at akka.actor.Props.cachedActorClass(Props.scala:207)
at akka.actor.Props.actorClass(Props.scala:327)
at akka.dispatch.Mailboxes.getMailboxType(Mailboxes.scala:124)
at akka.actor.LocalActorRefProvider.actorOf(ActorRefProvider.scala:718)

Props.scala ファイルを詳しく調べたところ、 isAssignableFrom が使用されているためにエラーが発生していることがわかりました。少しテストしたところ、次の紛らわしい動作があることがわかりました。

println(clazz.isInstanceOf[Class[Actor]])         // returns true
println(classOf[Actor].isAssignableFrom(clazz))   // returns false

この動作を回避する方法はありますか? システムクラスローダーと URL クラスローダーで定義されている Actor クラスに関係があると思います。私のプラグインの試みは可能ですか?

ああ、私はscala 2.10.2でakka 2.2.1を使用しています

編集

1つの点を明確にするclazz.isInstanceOf[Class[Actor]]ために、 は型消去のために何にでも当てはまります。

4

0 に答える 0