2017-06-05 27 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 –

相關問題