2016-03-30 7 views
1

EDIT: Исключение, связанное с сериализацией/десериализацией Акка Актер остается после того, как forEach подтверждается, что выполняется. Я изучаю Акку и сталкиваюсь с этой проблемой сериализации, я совершенно новичок в Akka и считаю довольно сложно понять, как лучше всего подойти к решению.Пытается десериализовать сериализованный ActorRef без системы ActorSystem - Spark/Akka/Scala

У меня есть класс, в котором создан actorSystem и актер, этот класс вызывает метод в другом классе, я хотел бы использовать моего актера в этом другом классе. До сих пор я пытался:

Class a: 
-create actor 
-classB.methodX(actor) 

Class b: 
-methodX(actorRef) 
--actorRef! message 

настоящее сообщение из класса б не присылают в то время как те, класс А сделать, это заставляет меня думать, что я либо нужно создать экземпляр нового актера с ActorRef, что я Переходим, или это совершенно неправильно.

Я понимаю, что система должна присутствовать на всех узлах, но я не уверен, как это сделать.

Edit: Код Отрывки:

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 
}) 
} 

Edited предоставить больше кода.

полный пример 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

@SarveshKumarSingh Что вы можете предложить для решения моей нынешней дилеммы? Должен ли каждый узел иметь машину? Это кажется экстремальным. Если узел может отправить сообщение на ногу, чтобы указать, чтобы нажать на ускоритель? – null

+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" 
    } 
} 

EDIT: Оказывается, после обсуждения в комментариях, что проблематичная часть была связана с Акки (попробуйте блок даже не выполняет), но я оставлю это здесь, в случае кто-то помогает.

+0

Эй, спасибо, что нашли время ответить, мне удалось получить пример (как то, что вы написали), работающий нормально. Я добавил еще несколько фрагментов, как я думаю, ваше право в отношении foreach, не могли бы вы взглянуть? Большое спасибо. – null

+0

Хм, я этого не вижу. В любом случае, пожалуйста, предоставьте полную, но минимальную выборку, которая по-прежнему вызывает проблемы (то есть отмените любую бизнес-логику и т. Д., Но оставьте типы, методы, классы, что угодно, чтобы воспроизвести ошибку). Полностью я имею в виду, что он может быть мгновенно скопирован в REPL/IDE и запущен без пропущенных зависимостей и т. Д. Даже если я не могу вам помочь, это увеличит ваши шансы на получение хорошего ответа. – slouc

+0

Спасибо slouc, должен быть там сейчас, я удалял пух из него.Вызывающий класс создает систему, актера, а затем актер передается как actorRef param – null