У меня есть набор устройств, на которых работает TCP-сервер.В моем приложении я хочу поддерживать одно TCP-соединение для каждого устройства.Для восстановления после сбоя каждое соединение является контролируемым актером Akka, запущенным из центрального участника: TcpClientManager
.
Я также хочу перезапустить такое соединение из вызова REST, независимо от его текущего контекста.
Вот почему я хочу перезапустить его из родительского актера, который является актором TcpClientManager`.Кажется, что из этого контекста я могу только остановить контролирующего актера.Это верно?Как перезапустить основной актер?
class TcpClientManager(devices: Seq[Device]) extends Actor with ActorLogging {
var idToActor = Map.empty[String, ActorRef]
override def preStart(): Unit =
devices(device => {
val tcpClientProps =
TcpClient.props(device)
val tcpClientSupervisorActor = BackoffSupervisor.props(
Backoff.onStop(
childProps = tcpClientProps,
childName = s"tcpCient-${device.id}",
minBackoff = 1 seconds,
maxBackoff = 5 seconds,
randomFactor = 0.2,
maxNrOfRetries = -1
))
idToActor += device.id -> context.actorOf(
tcpClientSupervisorActor,
name = s"tcpClientSupervisorActor-${device.id}")
})
override def receive: Receive = {
case ResetConnection(id) => {
println(s"reset connection for deviceId $id")
idToActor.get(id).foreach(context.stop(_)) // not really... this stops the supervisor
}
}
}