как выполнить код после исключения в scala с помощью Try

у меня есть два участника, они могут либо вернуть результат, который в моем случае является логическим значением, либо они могут выбросить исключение, вот мой код

val futureA: Future[Boolean] = ask(ActorA, MessageA(obj)).mapTo[Boolean]
val resultA = Await.result(futureA, timeout.duration) //can return boolean or throw an exception 

val futureB: Future[Boolean] = ask(ActorB, MessageB(obj)).mapTo[Boolean]
       val resultb = Await.result(futureB, timeout.duration)//can return boolean or throw an exception

Здесь я хочу реализовать
сценарий-1, если futureA и FutureB будут успешными, я должен получить что-то вроде (futureResponseA, futureResponseB) // (true, true)

сценарий-2, если futureA не работает, он должен продолжить работу с FutureB, если он вернется успешно, я должен получить что-то вроде (exceptionOfFutureA, resultofFutureB)

сценарий-3, если futureA возвращается успешно, а futureB терпит неудачу, я должен получить что-то вроде (futureResponseA, exceptionOfFutureB)

сценарий-4, если оба futureA и futureB потерпели неудачу, я должен получить что-то вроде (exceptionOfFutureA, exceptionOfFutureB)

для этого я попробовал с val futureA = ask (ActorA, MessageA (obj)). mapTo [Boolean] val futureB = ask (ActorB, MessageB (obj)). mapTo [Boolean]

  val f = Try {Future.sequence(List(futureA, futureB))}
  val result = Await.result(f, Duration.Inf)

но я получаю сообщение об ошибке в этой val result строке

found   : scala.util.Try[scala.concurrent.Future[List[Boolean]]]
[error]  required: scala.concurrent.Awaitable[?]

Как я могу заархивировать эти сканеры, пожалуйста, руководство


person swaheed    schedule 20.02.2019    source источник


Ответы (1)


Try не Awaitable, а Future не вызовет исключения, а Await может. Таким образом, вам нужно заключить Await в Try, и, поскольку вы хотите зафиксировать один или оба сбоя, это означает 2 разных Await.

val resultTuple = (Try(Await.result(futureA, Duration.Inf))
                  ,Try(Await.result(futureB, Duration.Inf)))

Тип результата - Tuple2[Try[Boolean],Try[Boolean]], который охватывает 4 изложенных вами сценария: (Успех, Успех) (Успех, Неудача) (Неудача, Успех) (Неудача, Неудача).

person jwvh    schedule 20.02.2019