Ecco lo schema che ho incontrato:Akka: modello per combinare i messaggi provenienti da più bambini
Un attore A
ha più figli C1
, ..., Cn
. Alla ricezione di un messaggio, lo A
lo invia a ciascuno dei suoi figli, che eseguono ciascuno dei calcoli sul messaggio e, al termine, lo rinviano a A
. A
vorrebbe quindi combinare i risultati di tutti i bambini per passare a un altro attore.
Come sarebbe una soluzione per questo problema? O si tratta di un anti-modello? In quale caso come dovrebbe essere affrontato questo problema?
Ecco un esempio banale che, si spera, illustra la mia soluzione attuale. Le mie preoccupazioni sono che è un codice duplicato (fino alla simmetria); non si estende molto bene a "molti" bambini; e rende piuttosto difficile vedere cosa sta succedendo.
import akka.actor.{Props, Actor}
case class Tagged[T](value: T, id: Int)
class A extends Actor {
import C1._
import C2._
val c1 = context.actorOf(Props[C1], "C1")
val c2 = context.actorOf(Props[C2], "C2")
var uid = 0
var c1Results = Map[Int, Int]()
var c2Results = Map[Int, Int]()
def receive = {
case n: Int => {
c1 ! Tagged(n, uid)
c2 ! Tagged(n, uid)
uid += 1
}
case Tagged(C1Result(n), id) => c2Results get id match {
case None => c1Results += (id -> n)
case Some(m) => {
c2Results -= id
context.parent ! (n, m)
}
}
case Tagged(C2Result(n), id) => c1Results get id match {
case None => c2Results += (id -> n)
case Some(m) => {
c1Results -= id
context.parent ! (m, n)
}
}
}
}
class C1 extends Actor {
import C1._
def receive = {
case Tagged(n: Int, id) => Tagged(C1Result(n), id)
}
}
object C1 {
case class C1Result(n: Int)
}
class C2 extends Actor {
import C2._
def receive = {
case Tagged(n: Int, id) => Tagged(C2Result(n), id)
}
}
object C2 {
case class C2Result(n: Int)
}
Se pensate che il codice è dio terribile, take it easy su di me, ho appena iniziato Akka di apprendimento;)
Dai un'occhiata alla soluzione per http://stackoverflow.com/questions/26319471/akka-design-principals/26328702#26328702. Praticamente lo stesso problema. –
Hmm mi scuso, ho pensato che qualcosa del genere sarebbe già stato chiesto, ma non ho trovato la domanda. – Mullefa