外部 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]]
ために、 は型消去のために何にでも当てはまります。