我正在嘗試使用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」?
我最好的猜測是你的FileObserverActor不是頂級類(stacktrace表示它是Actors.FileObserverActor)。你有沒有試過把它變成公共課? –
@DiegoMartinoia對不起,延遲迴復。 「Actors」中的同一包中的「FileObserverActor」和「FileUploaderActor」。所以這不應該成爲一個問題嗎? – Akan
對不起,我將Java和Scala混合在一起(最近在同時玩兩個遊戲)並混合了構造函數的可見性規則。無視評論, –