scala – 如何根据类名创建一个Akka Actor
发布时间:2020-12-16 18:26:09 所属栏目:安全 来源:网络整理
导读:我想通过使用类名创建一个Akka actor,如图所示. 我尝试了很多变体的system.actorOf(new Props(theProcessor.getClass),name =“Test”), 但我无法让这个工作.从类加载器创建Actor的任何想法 package com.testimport akka.actor.{Props,Actor,ActorRef,ActorS
我想通过使用类名创建一个Akka actor,如图所示.
我尝试了很多变体的system.actorOf(new Props(theProcessor.getClass),name =“Test”), 但我无法让这个工作.从类加载器创建Actor的任何想法 package com.test import akka.actor.{Props,Actor,ActorRef,ActorSystem} object Main { def main(args: Array[String]) { ActorFromString("Test") } } object ActorFromString { implicit val system = ActorSystem("Test") def apply(name: String): ActorRef = { val className = "com.test." + name + "Processor" val theProcessor: Actor = Class.forName(className).newInstance().asInstanceOf[Actor] system.actorOf(new Props(theProcessor.getClass),name = "Test") } } class TestProcessor extends Actor { def receive = { case data => println("processing data") } } Exception in thread "main" akka.actor.ActorInitializationException: You cannot create an instance of [com.test.TestProcessor] explicitly using the constructor (new). You have to use one of the factory methods to create a new actor. Either use: 'val actor = context.actorOf(Props[MyActor])' (to create a supervised child actor from within an actor),or 'val actor = system.actorOf(Props(new MyActor(..)))' (to create a top level actor from the ActorSystem) at akka.actor.ActorInitializationException$.apply(Actor.scala:166) at akka.actor.Actor$class.$init$(Actor.scala:377) at com.test.TestProcessor.<init>(ActorFromString.scala:20) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:525) at java.lang.Class.newInstance0(Class.java:374) at java.lang.Class.newInstance(Class.java:327) at com.test.ActorFromString$.apply(ActorFromString.scala:15) at com.test.Main$.main(ActorFromString.scala:7) at com.test.Main.main(ActorFromString.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:601) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) Process finished with exit code 143 解决方法
您可以使用Java API(仅用于Props实例化):
val myActor = system.actorOf( new Props( Class.forName( "myActorClassName" ).asInstanceOf[Class[Actor]] ) ) 重要的部分是新关键字.如果省略它,则将使用Scala API,而不允许按类实例化. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |