akka scala:URLClassLoader导致actor失败isAssignableFrom

时间:2013-11-22 14:33:09

标签: scala akka urlclassloader

我正在尝试从外部jar动态加载actor,然后将该actor添加到ActorSystem中。我想要一个用于加载actor的插件式架构。到目前为止,我尝试了以下代码:

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

这种行为有办法解决吗?我猜它与在系统类加载器和URLclassloader中定义的Actor类有关。我的插件尝试甚至可能吗?

哦,我正在使用带scala 2.10.2的akka​​ 2.2.1

修改

为了澄清一点,clazz.isInstanceOf[Class[Actor]]对于任何事情都是正确的,因为类型擦除。

0 个答案:

没有答案