Play-Utils:一个专门为 Play Framework 开发的实用工具包模块
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
。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Flask跨域请求的处理方法
在Flask开发RESTful后端时,前端请求会遇到跨域的问题。下面是解决方法: 使用 flask-cors库可以很容易的解决 pip install flask-cors 两种方法,一个是全局/批量的,一个是单一独立的: 安全起见,一般来说使用独立的方式会常用一些。 1.独立方式 通过给路由添加@cross_origin标识即可 from flask import Flask, jsonify from flask_cors import cross_origin @app.route('/upload', methods=['POST', 'OPTIONS']) @cross_origin() def upload(): # todo result_text = {"result": "True"} return jsonify(result_text) 2.全局方式 也很简单: from flask import Flask from flask_cors import CORS app = Flask(__name__) CORS(app...
- 下一篇
以太坊开发去中心化投票DApp与智能合约实例
在整个加密货币市场的市值超过7000亿美元之后,加密货币市场在过去几个月太疯狂了,但这只是一个开始。随着区块链系统的不断发展和扩展,进入这一新领域并利用这项技术的一个好方法是使用去中心化应用程序,也称为dApps。 CryptoKitties以其使以太坊区块链拥挤而闻名,是dApp的一个很好的例子,它将可养殖和可收藏的概念与区块链相结合。这个耸人听闻的游戏只是一个创造性的例子,几乎有无限的机会。 虽然看似非常复杂,但已经开发出某些框架和工具来抽象你与区块链和智能合约的交互。在这篇博文中,我将通过一种方式在以太坊上创建一个去中心化的投票应用程序。我将简要介绍以太坊,但你可能应该对它有所了解,以便充分利用本指南。另外,我希望你知道Javascript。 为什么要开发去中心化投票应用? 从本质上讲,利用区块链技术的去中心化应用程序允许你在没有可信赖的第三方的情况下执行与今天相同的操作(如转移资金)。最好的dApp具有特定的真实世界的用例,以便利用区块链的独特特征。 从本质上讲,区块链是一个共享的,可编程的,加密安全的,可信赖的分类账本,没有任何一个用户可以控制,任何人都可以查询。- Klau...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS关闭SELinux安全模块
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7安装Docker,走上虚拟化容器引擎之路
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS6,7,8上安装Nginx,支持https2.0的开启