Helo, как правило, я реализую его с помощью List, или если вы хотите Map, типа объектов. Либо: Left и Right (для сохранения информации об итогах каждого актера - успех или неудача) и проверка длины карты каждый раз, когда новое сообщение из принимается ребенок, и когда все полученные сообщения отправляются на самообслуживание WorkDone или sth с этим значением.
Где-то в сети я видел модель с отдельным актером, созданной для сбора всех сообщений образуют Чайлдс
superactor:
val n = 1000
val collector = system.actorOf(Props(classOf[Collector],n)
for(i<-1 to n){
system.actorOf(Child.props()).!(DoSomeWork)(collector)
}
коллектор
class Collector(expectedMsgs: Int) extends Actor {
var results = someCollection
def endCollecting() = {
// You can add here some logic before returning data
context.parent ! results.toList //or whatever you want
context.become(afterWork)
}
def receive = {
case r: DataDone =>
results += Right(r)
if(results.length>=expectedMsgs){
endCollecting()
}
case r: DataFail =>
results += Left(r)
if(results.length>=expectedMsgs){
endCollecting()
}
}
def afterWork = {
case _ =>
// for catch some late or mutiple messages
}
}
Также обратите внимание на http://doc.akka.io/docs/akka/snapshot/contrib/aggregator.html
Что точку отправки A 'WorkDone' сообщение обратно к себе, а не просто делать, что работа инлайн прямо там. Похоже на ненужный дополнительный удар по почтовому ящику. Если бы вы были в обратном вызове 'Future', тогда это мог бы быть правильный подход, но вы этого не сделали, поэтому это кажется ненужным. – cmbaxter
В этом точном коде Да, вы правы, но это хорошее место, чтобы сделать некоторую логику после того, как все сообщения собраны, но перед их возвратом, но, может быть, лучше будет impement с использованием метода, я отредактирую этот ответ – Morgaroth