2019独角兽企业重金招聘Python工程师标准>>>

Play-Utils 介绍

Play-Utils 是一个专门为 Play Framework 开发的实用工具包模块,目前已实现如下功能:

  • Retry 自动请求重试

1 Retry

Retry 工具包可以帮助你设置不同的重试策略,自动重试失败的请求,最终返回成功的结果或者是最后一次重试结果。

1.1 基本用法

将以下依赖添加至build.sbt文件:

libraryDependencies += "cn.playscala" %% "play-utils" % "0.1.0"

最简单的重试策略是固定时间重试,即每次重试的时间间隔相同。 在开始编码之前,你需要将Retry实例依赖注入到需要的地方:

class ExternalService @Inject()(retry: Retry)

下面的代码使用固定时间重试策略,每秒重试一次,最多重试3次:

import scala.concurrent.duration._retry.withFixedDelay[Int](3, 1 seconds) { () =>Future.successful(0)
}.stopWhen(_ == 10)

stopWhen 用于设置重试终止条件,即当 Future 结果为 10 时直接返回该Future。你也可以使用 retryWhen 设置重试条件:

import scala.concurrent.duration._retry.withFixedDelay[Int](3, 1 seconds) { () =>Future.successful(0)
}.retryWhen(_ != 10)

需要特别注意的是,如果在重试过程中发生异常,则会自动继续进行下一次重试。

除了采用依赖注入方式,你也可以直接使用单例对象Retry, 但是需要注意的是,选择单例对象方式需要在当前作用域内提供如下两个隐式对象:

implicit val ec: ExecutionContext = ...
implicit val scheduler: Scheduler = ...Retry.withFixedDelay[Int](3, 1 seconds).apply { () =>Future.successful(0)
}.retryWhen(s => s != 10)

下文中如无特殊说明,默认为采用依赖注入方式,注入实例变量名为retry

你可以通过 withExecutionContext 和 withScheduler 两个方法设置自定义的线程池和定时器:

import scala.concurrent.duration._retry.withFixedDelay[Int](3, 1 seconds) { () =>Future.successful(0)
}.withExecutionContext(ec).withScheduler(s).retryWhen(_ != 10)

1.2 重试策略

某些场景下,固定时间重试可能会对远程服务造成冲击,因此Retry提供了多种策略供你选择。

1.2.1 BackoffRetry

BackoffRetry包含两个参数,参数delay用于设置第一次延迟时间,参数factor是一个乘积因子,用于延长下一次的重试时间:

import scala.concurrent.duration._retry.withBackoffDelay[Int](3, 1 seconds, 2.0) { () =>Future.successful(0)
}.retryWhen(_ != 10)

重试的延迟时间依次为:1 seconds2 seconds 和 4 seconds

1.2.2 JitterRetry

JitterRetry包含两个参数minDelaymaxDelay,用于控制延迟时间的上限和下限,真实的延迟时间会在这两个值之间波动:

import scala.concurrent.duration._retry.withJitterDelay[Int](3, 1 seconds, 1 hours) { () =>Future.successful(0)
}.retryWhen(_ != 10)

1.2.3 FibonacciRetry

FibonacciRetry使用斐波纳契算法计算下一次的延迟时间:

import scala.concurrent.duration._retry.withFibonacciDelay[Int](4, 1 seconds) { () =>Future.successful(0)
}.retryWhen(_ != 10)

重试的延迟时间依次为:0 seconds1 seconds1 seconds 和 2 seconds

需要注意的是,你可以设置baseDelay参数控制延迟的时间间隔:

import scala.concurrent.duration._retry.withFibonacciDelay[Int](4, 2 seconds) { () =>Future.successful(0)
}.retryWhen(_ != 10)

重试的延迟时间依次为:0 seconds2 seconds2 seconds 和 4 seconds

转载于:https://my.oschina.net/joymufeng/blog/2086084

Play-Utils:一个专门为 Play Framework 开发的实用工具包模块相关推荐

  1. Microsoft .NET Compact Framework 开发常见问题解答

    这个 FAQ 有部分是通过编辑公共 .NET Compact Framework 新闻组 (microsoft.public.dotnet.framework.compactframework) 贴出 ...

  2. Mesos Framework开发指南 一

    2019独角兽企业重金招聘Python工程师标准>>> Mesos Framework开发指南 一 博客分类: 架构 mesos Framework Development Guid ...

  3. .NET Micro Framework开发板用户简明手册(v3.0)

    说明:前段时间已经先后发布了<.Net Micro Framework开发板用户简明手册>和< .NET Micro Framework开发板用户简明手册(v2.0)>,分别对 ...

  4. Yii Framework 开发教程(32) Zii组件-GridView示例

     CGridView 以表格的形式显示数据,CGridView 也支持分页和排序,CGridView最基本的用法和ListView类型,也是通过设置 data provider,通常是CActiv ...

  5. Yii Framework 开发教程Zii组件-Tabs示例

    有关Yii Tab类: http://www.yiichina.com/api/CTabView http://www.yiichina.com/api/CJuiTabs http://blog.cs ...

  6. Yii Framework 开发教程(41) Zii组件-Tabs示例

     CJuiTabs 显示分页UI组件,和Yii Framework 开发教程(17) UI 组件 TabView示例功能类似,它封装了 JUI tabs插件. 前基本用法如下: [php] vie ...

  7. Microsoft .NET Compact Framework 开发常见问题解答 - 专注.NET技术及其相关应用开发! - 博客园...

    Microsoft .NET Compact Framework 开发常见问题解答 发布日期: 3/30/2005 | 更新日期: 3/30/2005 Microsoft .NET Compact F ...

  8. Mesos Framework开发

    Mesos 介绍 Mesos 官网是这样介绍自己的: Program against your datacenter like it's a single pool of resources Apac ...

  9. 我是如何从Android开发转framework开发的

    转framework开发快一年了,一直都想写一篇文章,分享一下自己的工作心得,也让做应用开发的小伙伴对framework开发有一定的了解,但因为种种原因耽搁了,今天就趁着工作闲暇之余,聊聊我从应用开发 ...

最新文章

  1. GIT之git常用配置和操作
  2. python中文意思k-python-RepeatedKFold实际上是什么意思?
  3. CASE软件Enterprise Architect简介和使用入门图解
  4. Java黑皮书课后题第8章:**8.37(猜测首府)编写一个程序,重复提示用户输入一个州的首府。当接收到用户输入后,程序报告答案是否正确。假设50个州以及它们的首府保存在一个二维数组中,提示用户回答所
  5. 快速排序算法QuickSort(二)
  6. .NET Core 3.1 编写混合 C++ 程序
  7. 日期格式化时注解@DateTimeFormat无效的问题分析
  8. seo按天扣费系统_网站seo优化多少钱,SEO快速排名按天扣费怎么样
  9. c++字符数组整数转换中文大写金额的形式_数字大写转换烦,内置格式多缺陷, VBA函数来解难...
  10. Javascript:radio单击触发事件
  11. python讲统计学 书籍_数据分析最需要的12本中文书(从入门到高阶)
  12. java fakepath_IE浏览器上传文件时本地路径变成”C:\fakepath\”的问题
  13. matlab中ones()、inf用法
  14. 研究生课程笔记:软件包在流行病学中的应用(二)——csurvey软件+抽样调查
  15. windows操作系统32位与64位的含义
  16. linux 光盘刻录命令,linux 刻录光盘 命令 cdrecord
  17. 【原创】《矩阵的史诗级玩法》连载十六:二元二次方程一般式和圆锥曲线的关系(下)
  18. 苹果浏览器限制input框输入是数字
  19. 比JMeter还轻量的压力测试工具是谁?Siege
  20. CodeForces 546-B (基础数学题签到)

热门文章

  1. 计算机应用基础教学计划第二学期,计算机应用基础教学计划
  2. LeetCode力扣(剑指offer 41-68)
  3. 【HBase】关于包org.apache.hadoop.hbase.client
  4. 安装 EndNote X 9.3.3
  5. 参加数学建模比赛小结
  6. Dendro NH2-PEG-Dendro NH2,Dendro Amine-PEG-Dendro Amine,PEG超支化树状胺
  7. malloc,calloc和realloc。
  8. 爬取拉钩 破解拉钩反爬机制
  9. mmap和shmget的区别
  10. 一个程序员wower的青春记录