akka创建actor时报错:IllegalArgumentException: no matching constructor found on class $iwC$$iwC$$iwC$$iwC$...

本文探讨了在Spark Shell中使用内嵌类作为Actor类时遇到的Java.lang.IllegalArgumentException错误,并解释了其根本原因。文章指出,为了避免此类错误,应将Actor类单独定义为外部类。通过实例演示了正确的实现方式,帮助开发者避免常见的编码陷阱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在spark-shell中输入范例中的代码:

import akka.actor.Actor
import akka.actor.Props
import akka.event.Logging
 
class MyActor extends Actor {
  val log = Logging(context.system, this)
  def receive = {
    case "test" ⇒ log.info("received test")
    case _      ⇒ log.info("received unknown message")
  }
}

val system = ActorSystem("MySystem")
  val myActor = system.actorOf(Props[MyActor], name = "myactor")

结果总是遇到如下错误:

scala>   val myActor = system.actorOf(Props[MyActor], name = "myactor")
java.lang.IllegalArgumentException: no matching constructor found on class $iwC$$iwC$$iwC$$iwC$MyActor for arguments []
	at akka.util.Reflect$.error$1(Reflect.scala:81)
	at akka.util.Reflect$.findConstructor(Reflect.scala:93)
	at akka.actor.Props.constructor(Props.scala:194)
	at akka.actor.Props.<init>(Props.scala:213)
	at akka.actor.Props$.apply(Props.scala:69)
	at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:24)

百思不得其解!最后终于找到了原因:不能采用内嵌类作为actor类!!!!spark-shell里面的类会被认为是内嵌类,为了避免以上错误,需要单独写类文件。

stackoverflow里面是这么解释的:

Take this example:

class A{
  class B{}
}

I can do new A, but new B will return an error. I have to do:

val a = new A
val b = new a.B

That's why akka failed to create this actor.



转载于:https://www.cnblogs.com/bluejoe/p/5115841.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值