Имя ребенка / родителя довольно запутанное, так как в этом коде нет отношений родитель / ребенокЛучше назвать их как DbProvider и DbClient.
Последовательность такова:
- Приложение отправляет
ProcessList
дочернему актеру (childActorRef ! ProcessList
) - Дочерний актер отправляет
GetList
родительскому актеру (parent ! GetList
) - Родительский актер отвечает дочернему актеру с помощью db (
sender() ! fromDb
) - Дочерний актер получаетдБ и распечатывает его
Обратите внимание, что в этом коде есть условие гонки, и теоретически дБ может быть List()
, а не List(1,2,3)
.
ЕдинственноеГарантия доставки в Akka заключается в том, что два сообщения, отправленные одним и тем же актером, будут обрабатываться в том порядке, в котором они были отправлены.В противном случае сообщения могут быть обработаны в любом порядке, и, в частности, сообщения, отправленные через третьего участника, могут опередить сообщения, отправленные напрямую.
В этом случае сообщение ProcessList
может быть обработано ChildActor
ирезультирующее сообщение GetList
может быть обработано ParentActor
до того, как сообщение GetFromDb
из приложения обработано ParentActor
.Если это произойдет, ответ на GetList
будет содержать значение БД по умолчанию.