scala - turorial RetryTemplate

在公司里面用java实现了一个RetryTemplate的模板,可能spring里面已经实现了,但是用scala实现了一个很简单的,就当作学习吧。
下面是RetryTemplate.scala


class RetryTemplate(c: Int, d: Long) {

require(c > 0 && d > 0)
val count = c
val delay = d

def this() {
this(10, 500)
}

def retryOperation(action: () => Unit): Unit = {
def wrapAction(): Boolean = {
action()
true
}
this.retryOperation(classOf[Boolean], wrapAction)
}

def retryOperation[T <: Any](returnType: Class[T], action: () => T): T = {
//scala里面的变量初始化真是坑跌。
var exception: Throwable = null.asInstanceOf[Throwable]
var result: T = null.asInstanceOf[T]
//scala里面没有break判断,直接return又会报ReturnNotControl的exception.
(1 to count).toStream.takeWhile(i => !exception.isInstanceOf[FinishStatus]).foreach {
_ =>
try {
result = action()
exception = new FinishStatus
} catch {
case ex: Throwable => {
exception = ex
delayTime
}
}
}

if (exception.isInstanceOf[FinishStatus]) {
result
} else {
Console.println("retry attempt max times, finish retry.")
throw exception
}
}

def delayTime(): Unit = {
Thread.sleep(delay);
}
}

private class FinishStatus extends Throwable with NoStackTrace



下面是测试代码

class HelloworldModule extends RetryTemplate {

def sayHello() = {
Console.println("sayHello")
//throw new IllegalStateException
}

}

object TestReretyTemplate {

def main(args: Array[String]) {
val helloworldModule = new HelloworldModule
helloworldModule.retryOperation(helloworldModule.sayHello)
}

}

希望对scala有更深理解的童鞋能够更好的实现。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值