java - AKKA actor创建错误

 le__citron 发布于 2022-10-26 02:48

class Master(val host: String, val port: Int) extends Actor
第一种写法
val masterActor=new Master(host, port)
val master = actorSystem.actorOf(Props(masterActor), "Master")

Exception in thread "main" akka.actor.ActorInitializationException: You cannot create an instance of [test.rpc.Master] explicitly using the constructor (new). You have to use one of the 'actorOf' factory methods to create a new actor. See the documentation.

at akka.actor.ActorInitializationException$.apply(Actor.scala:167)
at akka.actor.Actor$class.$init$(Actor.scala:423)
at test.rpc.Master.(Master.scala:13)
at test.rpc.Master$.main(Master.scala:106)
at test.rpc.Master.main(Master.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

You cannot create an instance of [test.rpc.Master] explicitly using the constructor (new). You have to use one of the 'actorOf' factory methods to create a new actor.

错误的代码是:val masterActor=new Master(host, port) 这行代码在执行的时候出错了,抛出了异常

第二中写法
这种写法就没有错误:
val master = actorSystem.actorOf(Props(new Master(host, port)), "Master")

第二种写法中也会是首先执行new Master(host,port),为什么第二种写法中就没有抛出异常呢???

以上两种写法都是会首先执行new Master的。

已知:actor的创建需要有继承体系,实例是不能直接使用new 来创建的。而是使用系统的actorOf方法来创建,注意Actor之间有层次关系(和人类社会一样)。

问题: 第二中写法也是直接new了actor 就没报错,原因是什么那



main方法主要代码:

def main(args: Array[String]): Unit = {
 

    val host = args(0)
    val port = args(1).toInt
    println(host)
    println(port)
   
    
    val config = ......

  
    val actorSystem = ActorSystem("MasterSystem", config)
//第一中方式,自己new,结果就是运行不起来,直接报错

  val masterActor= new Master(host, port)
  val master = actorSystem.actorOf(Props(masterActor), "Master")
 

//第二种方式, 这行代码中也有new Master,但是程序可以正常运行,不会出错
val master = actorSystem.actorOf(Props(new Master(host, port)), "Master")


  
    actorSystem.awaitTermination()

  }

1 个回答
  • 第二种哪里是直接new了,不是actorSystem的工厂方法创建的么?把你的main方法所有代码贴出来

    2022-10-27 00:36 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有