I would like to create an Akka actor by using the class name, as shown. I've tried many variations of system.actorOf(new Props(theProcessor.getClass), name = "Test"), but I just cannot get this to work. Any idea in creating an Actor from the class loader
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