在例外情况下应用未来



这个代码工作得很好,但我想管理线程,由FuturesendSMS方法通常需要3到5秒来执行,我想应用未来并应用在一个地方,但想知道它是否足够?

val c = for {
            t <- Future { doSendSms("+9178787878787","i scare with threads") }
          } yield t
c.map { res =>
        res match {
          case e: Error => {
            Ok(write(Map("result" -> "error")))
          }
          case Success() => {
            Ok(write(Map("result" -> "success")))
          }
def doSendSms(recipient: String, body: String): SentSmsResult = {
    try {
      sendSMS(recipient, body)
      Success()
    } catch {
      case twilioEx: TwilioRestException =>
          return Error(twilioEx.toString)
      case e: Exception =>
          return Error(e.toString)
    }
  }

def sendSMS(smsTo: String, body: String) = {
    val params = Map("To" -> smsTo, "From" -> twilioNumber, "Body" -> body)
    val messageFactory = client.getAccount.getSmsFactory
    messageFactory.create(params)
  }// sending sms from twilio, this method takes 3 to 5 seconds to execute

我将使用recover:

val c = for {
  t <- doSendSms("+9178787878787","i scare with threads")
} yield t
def doSendSms(recipient: String, body: String): Future[SentSmsResult] = 
  Future {
    sendSMS(recipient, body)
  }
  .recover {
    case twilioEx: TwilioRestException => Error(twilioEx.toString)
    case e: Exception => Error(e.toString)
  }
}

recover将捕获在未来执行中抛出的异常,允许您返回用Future包装的新结果,如文档所述:

恢复组合子创建一个新的future,如果它成功完成,则该future与原始future具有相同的结果。如果没有,则将部分函数参数应用于失败的Throwable。

相关内容

最新更新