gpt4 book ai didi

java - ClassCastException:接口(interface) akka.actor.Scheduler 不能从类 akka.actor.LightArrayRevolverScheduler 分配

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:25:32 24 4
gpt4 key购买 nike

我正在尝试运行我已经在各种条件下成功运行了几个月的东西。我在运行 Java 7 的 Java 应用程序中使用 akka-actor_2.11 2.3.4 和 scala-library 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)

有问题的电话是:system= ActorSystem.create("MyActorSystem");

此调用发生在类的构造函数中,该类通过反射 ala getConstructor(...).newInstance(...) 动态加载。

当我写的分布式计算环境的用户尝试执行一个动态实例化作业的作业时,问题就出现了,该作业动态实例化一个作业(2 级反射实例化)。基本上,类似于这个伪调用列表:

reflectivelyCreate(job)
job.reflectivelyCreate(job2)
job2.instantiateActorSystem()
<fail>

如果我按以下方式运行完全相同的代码:

reflectivelyCreate(job2)
job2.instantiateActorSystem()
<success>

一切正常。

我的问题是在 Java 的幕后是否发生了一些与有状态类加载器相关的魔术,以至于 Akka 对其状态的假设是不正确的。我发现的类似问题 ( Akka ActorSystem creation issue ) 似乎与线程/scala repl 调用有关,但我的代码是单线程的,并且在上述成功和失败情况下的调用方式相同。据我所知,有问题的调用仅在调用堆栈的深度有所不同时才会发生。

非常感谢 akka 专家的任何意见!

最佳答案

如果其他人偶然发现了这个;在我的案例中,问题是我在可能也使用 Akka 的同一进程中使用了 Scala 解释器。其他多类加载器场景可能会出现相同的问题。这是针对我的案例的修复:

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

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

关于java - ClassCastException:接口(interface) akka.actor.Scheduler 不能从类 akka.actor.LightArrayRevolverScheduler 分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36290935/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com