编辑:有关序列化/反序列化Akka Actor的异常在forEach被确认执行后仍然存在。 我正在学习Akka并遇到这个序列化问题,我对Akka很新,并且发现很难弄清楚如何最好地解决问题。
我有一个创建了actorSystem和actor的类,该类在另一个类中调用一个方法,我想在另一个类中使用我的actor。到目前为止,我已经尝试过:
Class a:
-create actor
-classB.methodX(actor)
Class b:
-methodX(actorRef)
--actorRef! message
目前来自b类的消息没有被发送,而A类的消息却没有被发送,这让我觉得我需要用我传入的ActorRef实例化一个新的Actor,或者它是完全错误的。 / p>
我知道系统需要存在于所有节点上,但我不确定该怎么做。
编辑:代码片段:
ClassA:
private val system = ActorSystem("System")
private val metricActor= system.actorOf(Props(new MetricActor("metrics")), name = "metrics")
metricActor ! message works fine
writeFiles(metricActor) //writeFiles is in another class
writeFiles(actor: ActorRef) {
f.forEach(v => {
actor ! message // this doesn't seem to work
})
}
编辑以提供更多代码。
classB的完整示例
def writeFiles(bucket: String, filesToWrite: RDD[(String, String)], actor:ActorRef): Unit =
filesToWrite.foreachPartition(f => {
f.foreach(v => {
try {
//actor ! ProcessSingleItem(MetricItem("File Created"))
logger.debug(s"Writing file:")
writeFile()
}
catch {
case e: Exception =>
//actor ! ProcessSingleItem(CloudWatchMetricItem("File create failure"))
logger.error("Error creating file", e)
}
})
})
答案 0 :(得分:1)
您所描述的内容应该有效。你没有粘贴完整的(但是最小的!)代码示例,所以我不能说出问题是什么(也许是你的foreach逻辑中的东西;我们甚至不知道f是什么),但这里肯定有用。试着建立起来。
object Test extends App {
class MetricActor extends Actor {
def receive = {
case a: String => println(a)
}
}
private val system = ActorSystem("System")
private val metricActor= system.actorOf(Props(new MetricActor()), name = "metrics")
OtherClass.writeFiles(metricActor) // prints "foo"
}
// this is in other file:
object OtherClass {
def writeFiles(actor: ActorRef) {
actor ! "foo"
}
}
编辑:在评论中讨论了有问题的部分与Akka无关(尝试阻止甚至没有执行),但是我会留在这里,以防它帮助某人。