尝试在没有ActorSystem的情况下反序列化序列化的ActorRef - Spark / Akka / Scala

时间:2016-03-30 12:45:04

标签: scala apache-spark akka

编辑:有关序列化/反序列化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)
    }
  })
})

1 个答案:

答案 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无关(尝试阻止甚至没有执行),但是我会留在这里,以防它帮助某人。