Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ClassCastException:接口akka.actor.Scheduler不可从类akka.actor.LightArrayRevolversScheduler分配_Java_Akka_Classcastexception - Fatal编程技术网

Java ClassCastException:接口akka.actor.Scheduler不可从类akka.actor.LightArrayRevolversScheduler分配

Java ClassCastException:接口akka.actor.Scheduler不可从类akka.actor.LightArrayRevolversScheduler分配,java,akka,classcastexception,Java,Akka,Classcastexception,我正在尝试运行一些我已经在各种条件下成功运行了几个月的东西。我使用的是运行Java7的Java应用程序中的akka-actor_2.11 2.3.4和scala库2.11.7。正如我所说,同样的代码已经运行了几个月。在最近的情况下,我得到以下信息: java.lang.ClassCastException: interface akka.actor.Scheduler is not assignable from class akka.actor.LightArrayRevolverSchedu

我正在尝试运行一些我已经在各种条件下成功运行了几个月的东西。我使用的是运行Java7的Java应用程序中的akka-actor_2.11 2.3.4和scala库2.11.7。正如我所说,同样的代码已经运行了几个月。在最近的情况下,我得到以下信息:

java.lang.ClassCastException: interface akka.actor.Scheduler is not assignable from class akka.actor.LightArrayRevolverScheduler
at akka.actor.ReflectiveDynamicAccess$$anonfun$getClassFor$1.apply(DynamicAccess.scala:69)
at akka.actor.ReflectiveDynamicAccess$$anonfun$getClassFor$1.apply(DynamicAccess.scala:66)
at scala.util.Try$.apply(Try.scala:192)
at akka.actor.ReflectiveDynamicAccess.getClassFor(DynamicAccess.scala:66)
at akka.actor.ReflectiveDynamicAccess.createInstanceFor(DynamicAccess.scala:84)
at akka.actor.ActorSystemImpl.createScheduler(ActorSystem.scala:677)
at akka.actor.ActorSystemImpl.<init>(ActorSystem.scala:576)
at akka.actor.ActorSystem$.apply(ActorSystem.scala:142)
at akka.actor.ActorSystem$.apply(ActorSystem.scala:109)
at akka.actor.ActorSystem$.create(ActorSystem.scala:57)
at akka.actor.ActorSystem.create(ActorSystem.scala)
如果我以以下方式运行完全相同的代码:

reflectivelyCreate(job2)
job2.instantiateActorSystem()
<success>
reflectivelyCreate(作业2)
job2.instantialeActorSystem()
一切正常

我的问题是,Java中是否有一些与状态类加载器相关的魔法在幕后发生,以至于Akka对其状态的假设是不正确的。我发现()类似的问题似乎与线程/scala repl调用有关,但我的代码是单线程的,在上面的成功和失败案例中都以相同的方式调用。据我目前所知,只有在调用堆栈深度不同的情况下才会发生有问题的调用


我将感谢阿克卡大师的任何意见

如果其他人偶然发现了这一点;我的例子中的问题是,我在同一个过程中使用了scala解释器,这也可能使用Akka。其他多个类加载器场景可能会出现相同的问题。以下是我的案例的解决方案:

  • 使用
    private static classloader ourClassLoader=CmdLineMain.class.getClassLoader()将我喜欢的类加载器(加载akka库的类加载器)保存在程序初始化时的静态字段中
  • 在使用scala解释器(显然用它喜欢的解释器替换了类加载器)之后,调用
    Thread.currentThread().setContextClassLoader(我们的类加载器)

我的程序是单线程的,但是肯定有其他方法来解决这个问题,例如每个线程维护自己的加载程序。这超出了本文的范围;)

假设类
akka.actor.lightArrayRevolversScheduler
实际上实现了接口
akka.actor.Scheduler
,那么堆栈跟踪中出现的异常的唯一可能解释就是
类加载器的有趣业务。恐怕我发现Akka的文档缺乏相关的细节,因此我没有提供解决方案。我可以使用封装相关ActorSystem组件的单例模式来解决这个问题,我可以在java进程开始时初始化这些组件,并根据需要获取它们。在这个奇怪的问题出现之前,我从来没有这样做过,也许其他人也会有类似的问题,也许会从知情人士的解释中受益。也许你有依赖版本的问题。你用什么做建筑?如果您使用maven和pom,那么如果您使用。。。?
reflectivelyCreate(job2)
job2.instantiateActorSystem()
<success>