Play-Utils:一个专门为 Play Framework 开发的实用工具包模块
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 seconds
, 2 seconds
和 4 seconds
。
1.2.2 JitterRetry
JitterRetry
包含两个参数minDelay
和maxDelay
,用于控制延迟时间的上限和下限,真实的延迟时间会在这两个值之间波动:
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 seconds
, 1 seconds
, 1 seconds
和 2 seconds
。
需要注意的是,你可以设置baseDelay
参数控制延迟的时间间隔:
import scala.concurrent.duration._retry.withFibonacciDelay[Int](4, 2 seconds) { () =>Future.successful(0)
}.retryWhen(_ != 10)
重试的延迟时间依次为:0 seconds
, 2 seconds
, 2 seconds
和 4 seconds
。
转载于:https://my.oschina.net/joymufeng/blog/2086084
Play-Utils:一个专门为 Play Framework 开发的实用工具包模块相关推荐
- Microsoft .NET Compact Framework 开发常见问题解答
这个 FAQ 有部分是通过编辑公共 .NET Compact Framework 新闻组 (microsoft.public.dotnet.framework.compactframework) 贴出 ...
- Mesos Framework开发指南 一
2019独角兽企业重金招聘Python工程师标准>>> Mesos Framework开发指南 一 博客分类: 架构 mesos Framework Development Guid ...
- .NET Micro Framework开发板用户简明手册(v3.0)
说明:前段时间已经先后发布了<.Net Micro Framework开发板用户简明手册>和< .NET Micro Framework开发板用户简明手册(v2.0)>,分别对 ...
- Yii Framework 开发教程(32) Zii组件-GridView示例
CGridView 以表格的形式显示数据,CGridView 也支持分页和排序,CGridView最基本的用法和ListView类型,也是通过设置 data provider,通常是CActiv ...
- Yii Framework 开发教程Zii组件-Tabs示例
有关Yii Tab类: http://www.yiichina.com/api/CTabView http://www.yiichina.com/api/CJuiTabs http://blog.cs ...
- Yii Framework 开发教程(41) Zii组件-Tabs示例
CJuiTabs 显示分页UI组件,和Yii Framework 开发教程(17) UI 组件 TabView示例功能类似,它封装了 JUI tabs插件. 前基本用法如下: [php] vie ...
- Microsoft .NET Compact Framework 开发常见问题解答 - 专注.NET技术及其相关应用开发! - 博客园...
Microsoft .NET Compact Framework 开发常见问题解答 发布日期: 3/30/2005 | 更新日期: 3/30/2005 Microsoft .NET Compact F ...
- Mesos Framework开发
Mesos 介绍 Mesos 官网是这样介绍自己的: Program against your datacenter like it's a single pool of resources Apac ...
- 我是如何从Android开发转framework开发的
转framework开发快一年了,一直都想写一篇文章,分享一下自己的工作心得,也让做应用开发的小伙伴对framework开发有一定的了解,但因为种种原因耽搁了,今天就趁着工作闲暇之余,聊聊我从应用开发 ...
最新文章
- GIT之git常用配置和操作
- python中文意思k-python-RepeatedKFold实际上是什么意思?
- CASE软件Enterprise Architect简介和使用入门图解
- Java黑皮书课后题第8章:**8.37(猜测首府)编写一个程序,重复提示用户输入一个州的首府。当接收到用户输入后,程序报告答案是否正确。假设50个州以及它们的首府保存在一个二维数组中,提示用户回答所
- 快速排序算法QuickSort(二)
- .NET Core 3.1 编写混合 C++ 程序
- 日期格式化时注解@DateTimeFormat无效的问题分析
- seo按天扣费系统_网站seo优化多少钱,SEO快速排名按天扣费怎么样
- c++字符数组整数转换中文大写金额的形式_数字大写转换烦,内置格式多缺陷, VBA函数来解难...
- Javascript:radio单击触发事件
- python讲统计学 书籍_数据分析最需要的12本中文书(从入门到高阶)
- java fakepath_IE浏览器上传文件时本地路径变成”C:\fakepath\”的问题
- matlab中ones()、inf用法
- 研究生课程笔记:软件包在流行病学中的应用(二)——csurvey软件+抽样调查
- windows操作系统32位与64位的含义
- linux 光盘刻录命令,linux 刻录光盘 命令 cdrecord
- 【原创】《矩阵的史诗级玩法》连载十六:二元二次方程一般式和圆锥曲线的关系(下)
- 苹果浏览器限制input框输入是数字
- 比JMeter还轻量的压力测试工具是谁?Siege
- CodeForces 546-B (基础数学题签到)
热门文章
- 计算机应用基础教学计划第二学期,计算机应用基础教学计划
- LeetCode力扣(剑指offer 41-68)
- 【HBase】关于包org.apache.hadoop.hbase.client
- 安装 EndNote X 9.3.3
- 参加数学建模比赛小结
- Dendro NH2-PEG-Dendro NH2,Dendro Amine-PEG-Dendro Amine,PEG超支化树状胺
- malloc,calloc和realloc。
- 爬取拉钩 破解拉钩反爬机制
- mmap和shmget的区别
- 一个程序员wower的青春记录