在公司里面用java实现了一个RetryTemplate的模板,可能spring里面已经实现了,但是用scala实现了一个很简单的,就当作学习吧。
下面是RetryTemplate.scala
下面是测试代码
希望对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有更深理解的童鞋能够更好的实现。