2017-06-05 28 views
0

我正在尝试使用akka演员在播放frmework中使用websocket。在类Actors.FileObserverActor上找不到匹配的构造函数,用于参数

HomeController.scala

def socket = WebSocket.accept[String, String] { request => 
    ActorFlow.actorRef(out => FileObserverActor.props(out)) 
    } 

演员/ FileUploaderActor.scala

class FileUploaderActor extends Actor{ 
    override def receive: Receive = { 

    case UploadFile(billerId, filename, subCategory, count, dueDate) => 

     val fileOberverActor = ActorSystem().actorOf(Props[FileObserverActor]) 
     val billerData = BillerFileUploadMetaData(billerId,filename,count,"ACTIVE", 
     new java.sql.Timestamp(new java.util.Date().getTime),subCategory,dueDate) 
     val sparkSession = SparkContextHelper.sparkSession; 
     import sparkSession.implicits._ 
     val rdd = sparkSession.sparkContext.parallelize(Seq(billerData)) 
     val df = rdd.toDF() 
     df.write.format("org.apache.spark.sql.cassandra").options(Map("keyspace" -> "billerplatform_schema", "table" -> "biller_file_uploads")).mode(SaveMode.Append).save 
     fileOberverActor ! FileUploaded(filename, count) 
    } 
} 

演员/ FileObserverActor.scala

class FileObserverActor(out: ActorRef) extends Actor{ 
    def receive = { 
    case FileUploaded(fileName, totalRecords) => 
     out ! ("Got the file " + fileName) 
    } 

} 

object FileObserverActor{ 
    def props(out: ActorRef) = Props(new FileObserverActor(out)) 
} 

获取跟踪:

java.lang.IllegalArgumentException: no matching constructor found on class Actors.FileObserverActor for arguments [] 
    at akka.util.Reflect$.error$1(Reflect.scala:81) 
    at akka.util.Reflect$.findConstructor(Reflect.scala:105) 
    at akka.actor.NoArgsReflectConstructor.<init>(IndirectActorProducer.scala:103) 
    at akka.actor.IndirectActorProducer$.apply(IndirectActorProducer.scala:60) 
    at akka.actor.Props.producer(Props.scala:131) 
    at akka.actor.Props.<init>(Props.scala:144) 
    at akka.actor.Props$.apply(Props.scala:86) 
    at Actors.FileUploaderActor$$anonfun$receive$1.applyOrElse(FileUploaderActor.scala:15) 
    at akka.actor.Actor$class.aroundReceive(Actor.scala:497) 
    at Actors.FileUploaderActor.aroundReceive(FileUploaderActor.scala:10) 

这是在FileUploaderActor中创建一个actor实例的问题吗?你能帮我调试这个问题吗?

编辑: 我创建了一个同伴对象“FileObserverActor”,因为它需要建立控制器和FileObserverActor通过WebSocket的之间的连接,

def socket = WebSocket.accept[String, String] { request => 
    ActorFlow.actorRef(out => FileObserverActor.props(out)) 
    } 

现在我也想将消息发送到“FileObserverActor”从“FileUploadActor”,但我无法从“FileUploadActor”创建一个实例,因为“FileObserverActor”参数化为“out:ActorRef”用于websocket连接。现在我怎么能从“FileUploadActor”发送消息到“FileObserverActor”?

+0

我最好的猜测是你的FileObserverActor不是顶级类(stacktrace表示它是Actors.FileObserverActor)。你有没有试过把它变成公共课? –

+0

@DiegoMartinoia对不起,延迟回复。 “Actors”中的同一包中的“FileObserverActor”和“FileUploaderActor”。所以这不应该成为一个问题吗? – Akan

+0

对不起,我将Java和Scala混合在一起(最近在同时玩两个游戏)并混合了构造函数的可见性规则。无视评论, –

回答

2

由于错误消息指出它期望FileObserverActor没有参数构造函数,但它没有找到。鉴于在创建FileObserverActor时需要out: ActorRef,请考虑在创建时传递参考。

的防线是Actors/FileUploaderActor.scala

val fileOberverActor = ActorSystem().actorOf(Props[FileObserverActor])

您可能希望它在阿卡更改为类似

val fileOberverActor = ActorSystem().actorOf(FileObserverActor.props(outActorRef))

欲了解更多信息,结账官方文档上Props

+0

这是@ashwanthkumar解释。另外,请(!)不要仅仅像这样写入'ActorSystem()',它应该托管所有的演员,所以应该有一个系统每个应用程序。在这里,您为演员收到的每条消息创建一个系统,这是一个可怕的想法,并会导致内存不足错误。请阅读有关演员的入门指南和基本文档http://doc.akka.io/docs/akka/current/scala/guide/index.html –

相关问题