Scala重试工具Retry

本文深入探讨了Scala中的重试工具Retry,介绍了其递归、Curry化和异常捕获等功能,详细展示了如何使用Retry来处理函数执行过程中的失败情况,并通过实例演示了不同调用方式下的重试机制。

Scala重试工具Retry

主要包括

  • 递归
  • Curry化
  • 异常捕获
  • scala.util.Try

源代码

import scala.annotation.tailrec
import scala.util.{Failure, Success, Try}

/**
 * Retry 重试工具
 * <p>
 * Date: 2018/1/19 9:58
 * @author ALion
 */
object Retry {

  private val className = getClass.getSimpleName

  /**
   * 递归实现Retry
   * @param times 重试次数, 默认10次
   * @param delay 重试延迟, 默认10秒
   * @param any 需要重试的任何函数
   * @param anyFail 任何函数 -> 失败时额外调用,默认可以不传
   * @return 传入的对象的执行结果
   */
  @tailrec
  def retry[A](times: Int = 10, delay: Long = 10000)(any: => A, anyFail: => A = null): A = {
    Try(any) match {
      case Success(v) =>
        println(s"[$className] Success: left $times times")
        v
      case Failure(e) =>
        println(s"[$className] Failure: left $times times")

        anyFail

        if (times > 0) {
          println(e)

          Thread.sleep(delay)

          retry(times - 1, delay)(any, anyFail)
        } else throw e
    }
  }

}

调用示例

  • 测试代码
/**
  * 重试工具测试
  *
  * @author ALion
  * @version 2018/12/14 12:26
  */
object Test {

  def main(args: Array[String]): Unit = {
    // 方式一
    Retry.retry()(1 / 0)

    // 方式二
    lazy val a = 2 / 0
    Retry.retry()(a)

    // 方式三
    Retry.retry()(hello())

    // 其他……

  }

  def hello(): Int = {
    3 / 0
  }

}
  • 控制台输出
[Retry$] Failure: left 10 times
java.lang.ArithmeticException: / by zero
[Retry$] Failure: left 9 times
java.lang.ArithmeticException: / by zero
……
[Retry$] Failure: left 1 times
java.lang.ArithmeticException: / by zero
[Retry$] Failure: left 0 times
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at com.skey.test.retry.Test$$anonfun$main$1.apply$mcI$sp(Test.scala:13)
	at com.skey.test.retry.Test$$anonfun$main$1.apply(Test.scala:13)
	at com.skey.test.retry.Test$$anonfun$main$1.apply(Test.scala:13)
	at scala.util.Try$.apply(Try.scala:192)
	at com.skey.test.retry.Retry$.retry(Retry.scala:27)
	at com.skey.test.retry.Test$.main(Test.scala:13)
	at com.skey.test.retry.Test.main(Test.scala)
Process finished with exit code 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值