перезапустить актера Акка с надзирающего актера - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть набор устройств, на которых работает 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
    }
  }
}
...