小编mep*_*ide的帖子

ClassCastException:接口akka.actor.Scheduler不能从类akka.actor.LightArrayRevolverScheduler分配

我试图在几个月的条件下运行我已成功运行的各种条件.我正在使用akka-actor_2.11 2.3.4与运行Java 7的Java应用程序中的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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

reflectivelyCreate(job)
job.reflectivelyCreate(job2)
job2.instantiateActorSystem()
<fail>
Run Code Online (Sandbox Code Playgroud)

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

reflectivelyCreate(job2)
job2.instantiateActorSystem()
<success>
Run Code Online (Sandbox Code Playgroud)

一切正常.

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

我很感激来自akka大师的任何意见!

java classcastexception akka

9
推荐指数
1
解决办法
1006
查看次数

Clojure宏作为函数/'部分'用于宏?

这类似于在处理Clojure宏中讨论的问题作为一个函数,但是当在顶部答案中尝试该方法时,我得到了一个错误.希望有太多关于我的特定应用程序的信息是没有必要的,因为它非常复杂,但这是我尝试做的事情的简化版本:

(defmacro make-fn [m arg1] 
    `(fn [& args#] 
      (eval `(~'~m ~'~arg1 ~@args#))))
Run Code Online (Sandbox Code Playgroud)

我在这个上下文中使用了宏:

(let [columns (make-columns table-width)
       table-name (keyword (str "table_" n))]
  (apply (make-fn helpers/tbl table-name) columns))
Run Code Online (Sandbox Code Playgroud)

"helpers/tbl"是一个宏,它需要一个表名关键字和一个包含列规范的可变数量的列表(如[:varchar 100]或其他东西).我正在尝试动态创建随机数据库表规范,以方便一些测试.无论如何,当试图执行上面的代码时,我收到以下错误:

CompilerException java.lang.RuntimeException: Unable to resolve symbol: table-name in this context, compiling:(NO_SOURCE_PATH:1) 
Run Code Online (Sandbox Code Playgroud)

我有点理解这个问题:宏扩展是在编译时完成的,我试图在宏扩展中包含一个运行时值,因此奇怪的使用引用和取消引用来使所有内容都设置得恰到好处.我基本上想要部分用于宏,并且我需要能够将这种机制重用于不同命名空间中的不同宏,并且所有的变量分辨率都是正确的.这甚至可能吗?

macros clojure partial

5
推荐指数
1
解决办法
610
查看次数

标签 统计

akka ×1

classcastexception ×1

clojure ×1

java ×1

macros ×1

partial ×1