`
暗夜骑士0376
  • 浏览: 79904 次
  • 性别: Icon_minigender_1
  • 来自: 信阳
社区版块
存档分类
最新评论

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有更深理解的童鞋能够更好的实现。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics