使用Spring-Retry重试处理

只要软件组件相互通信,就有可能出现临时的自我纠正错误。 此类故障包括服务的暂时不可用,网络连接的暂时丢失或服务繁忙时出现的超时。 在这种情况下,适当的重试处理可以减少这些故障可能引起的问题。

在这篇文章中,我们将看到如何使用Spring Retry向Spring应用程序添加健壮的重试逻辑。 Spring Retry可能不是很了解,因为它没有在Spring文档概述中列出。 但是,您可以在Spring Initializr页面上找到它。

设定

要使用Spring Retry,我们需要在项目中添加以下依赖项:

<dependency><groupid>org.springframework.retry</groupid><artifactid>spring-retry</artifactid><version>1.1.2.RELEASE</version>
</dependency>

Spring Retry使用AOP,因此请确保Spring AOP可用:

<dependency><groupid>org.springframework</groupid><artifactid>spring-aop</artifactid><version>4.2.5.RELEASE</version>
</dependency>
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.8</version>
</dependency>

如果您使用的是Spring Boot ,那么可以改用spring-boot-starter-aop:

<dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-aop</artifactid>
</dependency>

要启用Spring Retry,我们只需要将@EnableRetry添加到我们的应用程序配置类中:

@EnableRetry
@SpringBootApplication // or @Configuration if you are not using Spring Boot
public class RetryExampleApplication {// ...
}

添加带注释的重试处理

现在,我们准备向方法添加重试处理。 为此,我们只需要使用@Retryable注释适当的方法:

@Service
public class MyService {@Retryablepublic void simpleRetry() {// perform operation that is likely to fail}
}

带有@Retryable注释的方法可以像其他任何方法一样调用。 但是,每当可重试方法的执行因异常而失败时,Spring都会自动重试多达三遍。 默认情况下,Spring在方法调用之间使用1秒的延迟。 请注意,调用线程在重试处理期间会阻塞。

重试行为可以通过多种方式自定义。 例如:

@Service
public class MyService {@Retryable(value = {FooException.class, BarException.class}, maxAttempts = 5)public void retryWithException() {// perform operation that is likely to fail}@Recoverpublic void recover(FooException exception) {// recover from FooException}
}

在这里,我们告诉Spring仅在抛出FooException或BarException类型的Exception时应用重试处理。 其他异常不会导致重试。 maxAttempts = 5告诉Spring如果失败,最多重试该方法5次。

使用@Recover我们为FooException定义了单独的恢复方法。 当可重试的方法因FooException而失败时,这使我们可以运行特殊的恢复代码。

使用RetryTemplate添加重试处理

除了注释之外,Spring Retry还提供了RetryTemplate,可用于在Java代码中定义重试处理。 像任何其他bean一样,可以在我们的配置类中简单地配置RetryTemplate:

@EnableRetry
@SpringBootApplication // or @Configuration if you are not using Spring Boot
public class RetryExampleApplication {@Beanpublic RetryTemplate retryTemplate() {SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();retryPolicy.setMaxAttempts(5);FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();backOffPolicy.setBackOffPeriod(1500); // 1.5 secondsRetryTemplate template = new RetryTemplate();template.setRetryPolicy(retryPolicy);template.setBackOffPolicy(backOffPolicy);return template;}// ...
}

RetryPolicy确定何时应重试操作。 SimpleRetryPolicy是一个RetryPolicy实现,可重试固定次数。

BackOffPolicy是一个策略界面,用于控制重试尝试之间的退避。 在继续之前,FixedBackOffPolicy会暂停一段固定的时间。 其他一些默认的BackOffPolicy实现是ExponentialBackOffPolicy(增加每次重试的退避时间)或NoBackOffPolicy(重试之间没有延迟)。

现在,我们可以将RetryTemplate注入我们的服务。 要使用重试处理来运行代码,我们只需调用RetryTemplate.execute():

@Service
public class RetryService {@Autowiredprivate RetryTemplate retryTemplate;public void withTemplate() {retryTemplate.execute(context -> {// perform operation that is likely to fail});}// ...
}

RetryTemplate.exeucte()以RetryCallback <T,E>作为参数。 RetryCallback是一个功能接口,因此可以使用Java 8 Lambda表达式来实现(如上所示)。

摘要

Spring重试提供了一种向Spring应用程序添加重试处理的简便方法。 可以使用批注(@Retryable和@Recover)或通过将RetryCallback传递给RetryTemplate来添加重试处理。

  • 您可以在GitHub上找到完整的示例源代码。

翻译自: https://www.javacodegeeks.com/2016/03/retry-handling-spring-retry.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机在智慧交通的应用论文,智能交通的毕业论文

智能交通的毕业论文智能运输系统的研究许多国家都投入了巨大的人力和物力,并成为继航空航天、军事领域之后高新技术应用最集中的领域。下面为大家分享了有关智能交通的论文&#xff0c;欢迎欣赏&#xff01;摘 要&#xff1a;八十年代以来&#xff0c;世界一些发达国家纷纷投入…

MySQL5.5安装教程

1、 官网下载mysql5.5 下载地址&#xff1a; http://dev.mysql.com/downloads/mysql/5.5.html#downloads 2、 安装mysql5.5 注意&#xff0c;安装之前&#xff0c;请关闭杀毒软件。 &#xff08;1&#xff09; 打开下载的mysql-5.5.53-winx64.msi &#xff08;2&#xff09; 点…

计算机软件硬件基础知识,计算机硬件基础_计算机软硬件基础知识都包括什么具体的内容...

计算机硬件基础怎么学过去有许多微型计算机原理的书&#xff0c;讲或的原理现在肯定还有这方面的书&#xff0c;但讲的是什么我就不知道了还有学学单片机也可以对计算机硬件原理有所了解还可看有关杂志&#xff0c;如《微型计算机》&#xff0c;刚开始可能许多文章都看不懂&…

php里的抽象类和接口

//实例化类产生对象。//class fenbi//{// //普通成员&#xff0c;属于对象// public $length "10cm";// //静态成员&#xff0c;静态变量&#xff0c;属于类。// public static $color;//// //普通方法可以调用静态成员// function hua(){// echo $this->l…

新疆计算机二级慨库,2020新疆维吾尔自治区计算机二级易考套餐:二级MS Office高级应用全程班(网课+题库+教材)...

&nbsp&nbsp[导读]:2020新疆维吾尔自治区计算机二级易考套餐&#xff1a;二级MS Office高级应用全程班(网课题库教材)&#xff0c;更多新疆等级考试易考套餐&#xff0c;请访问易考吧新疆等级考试栏目2020新疆维吾尔自治区计算机二级易考套餐&#xff1a;二级MS Office高…

hotspot jvm_在Hotspot JVM中跟踪过多的垃圾收集

hotspot jvm由于内存泄漏或其他内存问题&#xff0c;经常导致应用程序冻结&#xff0c;仅使垃圾收集器&#xff08;GC&#xff09;进程运行失败&#xff0c;试图释放一些空间。 直到看门狗&#xff08;或沮丧的管理员&#xff09;重新启动应用程序并且问题从未解决之前&#xf…

计算机上平方米的单位,word怎么写平方米 word中平方米的单位怎么打

1、以Word2010版本为例&#xff0c;在文档中输入了平方米的单位&#xff0c;但是数字2不在上方&#xff1b;2、首先选中数字2&#xff0c;然后点击页面上方的上标图标&#xff0c;如下图所示&#xff1b;3、点击上标图标后&#xff0c;就会发现数字2在字母的右上方了&#xff0…

Xamarin 2017.10.9更新

Xamarin 2017.10.9更新本次更新主要解决了一些bug。Visual Studio 2017升级到15.4获得新功能。Visual Studio 2015需要工具-选项-Xamarin进行更新&#xff0c;更新Xamarin插件到4.7.10.22 版本。工具包分享链接&#xff1a;http://pan.baidu.com/s/1dE5hnCP 密码&#xff1a;3k…

通过入侵JVM打印阵列

总览 Java中最常见的陷阱之一就是知道如何打印数组。 如果有关如何打印阵列的答案获得了超过1000票赞成票&#xff0c;那么您必须怀疑是否有更简单的方法。 几乎所有其他流行语言都具有这种更简单的方法&#xff0c;因此我不清楚Java为什么仍会这样做。 与其他JDK类不同&#…

一种同于计算机键盘的测试装置,一种计算机键盘按键测试装置

主权项&#xff1a;1.一种计算机键盘按键测试装置&#xff0c;包括顶架以及固定安装在顶架正下方的测试机&#xff0c;其特征在于&#xff1a;顶架底面与测试机顶面之间固定连接有连接架&#xff0c;测试机内设有敲打装置和除尘装置&#xff0c;敲打装置包括设置在测试机左侧底…

SQL Server 索引重建手册

注意&#xff1a;索引重建前建议把数据库切换为完整模式&#xff0c;否则索引复制会在数据文件中进行&#xff0c;导致数据文件很大&#xff0c;而数据文件的收缩比日志文件的收缩要困难的多&#xff0c;且会对业务造成影响。步骤一:查询索引碎片&#xff0c;脚本如下&#xff…

三角形面积计算机方法,数学知识点:三角形面积的计算

原标题&#xff1a;数学知识点&#xff1a;三角形面积的计算复习&#xff11;、说说长方形、平行四边形的面积计算公式。长方形的面积长宽平行四边形的面积底高2、 计算下面长方形和平行四边形的面积&#xff0e;生活中常见的三角形思考 :怎样应用所学的方法探究三角形的面积计…

mysql学习第二天

alter tables转载于:https://www.cnblogs.com/hanxue112253/p/7657309.html

apache camel_令人印象深刻的第一个Apache Camel版本

apache camel在准备下周的CamelOne会议时&#xff0c;我花了一些时间回顾一下Apache Camel项目的历史。 因此&#xff0c;除其他外&#xff0c;我了解了Apache Camel的第一个正式1.0版本 。 Apache Camel 1.0 – 5年前 我看的越多&#xff0c;这个版本的事实给我留下了深刻的印…

notion自建服务器,【速报】Notion的特色「双向链接」方案来了,Synced Block 登场...

Notion 作为一款出色的「聚合型」(All-In-One)笔记 App&#xff0c;在这几年里逐渐获得了不少知识工作者的宠爱。在以前&#xff0c;大家一般会高度赞扬 Notion 的「模块化」编辑器&#xff0c;但同时也会好奇什么时候 Notion 可以带来像Roam Research 那样的 「双向链接」功能…

English 动词篇

动词后加to do 和 doing的记忆口诀 一、只能用动名词(ing)作宾语 [口诀] 考虑建议盼原谅&#xff0c;承认推迟没得想。 避免错过继续练&#xff0c;否定完成停欣赏。 禁止想象才冒险&#xff0c;不禁介意弃逃亡。 consider考虑suggest建议/advocate 提倡主张look forw…

本周Java技巧#7 – Maven慢吗?

本周Java本周技巧是有关Maven的上一期的后续内容。 第一个视频介绍了与Maven依赖关系有关的方面。 该视频将介绍一些加快Maven构建速度的技术。 Maven慢吗&#xff1f; 从Maven 3开始&#xff0c;您可以并行运行构建。 根据构建机器和项目结构的不同&#xff0c;您可能会获得6…

华北电力大学的计算机类专业排名,2018年华北电力大学王牌专业排行榜,考生和家长们都好好看看!...

华北电力大学有两个校区&#xff0c;一个是北京校区&#xff0c;一个是保定校区&#xff0c;在理科类的院校中&#xff0c;这所大学还是非常不错的&#xff0c;小编有幸去这个学校玩过几次&#xff0c;这个学校的占地面积非常大&#xff0c;环境相对比较优美&#xff0c;而且学…

剑指offer之 二叉搜索树的后续遍历序列

题目描述&#xff1a; 输入一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 public class Solution {public boolean VerifySquenceOfBST(int [] sequence) {if(sequence.lengt…

11input/output

输出重定向 command1 > file1 vim test hello cat test who > users cat test echo "nihao" > test cat test 输入重定向 command1 < file1 wc -l test  统计行数 重定向深入了解 一般情况下&#xff0c;每个 Unix/Linux 命令运行时都会打开三个文件&a…