春天猫rtsy

好的,这实际上与冬天无关,众所周知,冬天已经到了 。 它与Spring Retry有关,Spring Retry是一个小的Spring框架库,它使我们可以向应重试的任何任务添加重试功能。

这里有一个很好的教程 ,解释了如何设置简单的重试和恢复。 它很好地解释了如何添加spring-retry依赖项 ,使用@Retryable和@Recover批注以及将RetryTemplate与简单策略一起使用。 当我们实际上想根据异常的类型应用不同的重试行为时,我想讲的是一个稍微复杂的情况。 这是有道理的,因为我们可能知道某些异常是可恢复的,而某些异常是不可恢复的,因此尝试从异常中恢复并没有太大的意义。 为此,有一个特定的重试策略实现,称为ExceptionClassifierRetryPolicy ,与Spring RetryTemplate一起使用 。

假设我们只能从IO异常中恢复并跳过所有其他异常 。 我们将创建三个类来扩展RetryCallback,并创建一个类来扩展RecoveryCallback以更好地显示内部发生的情况:

private class SuccessCallback implements RetryCallback<Boolean, RuntimeException> {@Overridepublic Boolean doWithRetry(RetryContext context) throws RuntimeException {System.out.println("Success callback: attempt " + context.getRetryCount());return true;}}private class ExceptionCallback implements RetryCallback<Boolean, Exception> {@Overridepublic Boolean doWithRetry(RetryContext context) throws Exception {System.out.println("Exception callback: attempt " + context.getRetryCount());throw new Exception("Test Exception");}}private class SpecificExceptionCallback implements RetryCallback<Boolean, IOException> {@Overridepublic Boolean doWithRetry(RetryContext context) throws IOException {System.out.println("IO Exception callback: attempt " + context.getRetryCount());throw new IOException("Test IO Exception");}}private class LoggingRecoveryCallback implements RecoveryCallback<Boolean> {@Overridepublic Boolean recover(RetryContext context) throws Exception {System.out.println("Attempts exhausted. Total: " + context.getRetryCount());System.out.println("Last exception: " + Optional.ofNullable(context.getLastThrowable()).orElse(new Throwable("No exception thrown")).getMessage());System.out.println("\n");return false;}}

然后,我们设置RetryTemplate 。 我们将使用SimpeRetryPolicy和IOException的固定尝试次数,以及一个NeverRetryPolicy ,它仅允许对其他所有事物进行初始尝试。

*We want to retry on IOException only.Other Exceptions won't be retried.IOException will be retried three times, counting the initial attempt.*/final ExceptionClassifierRetryPolicy exRetryPolicy = new ExceptionClassifierRetryPolicy();exRetryPolicy.setPolicyMap(new HashMap<Class<? extends Throwable>, RetryPolicy>() {{put(IOException.class, new SimpleRetryPolicy(3));put(Exception.class, new NeverRetryPolicy());}});retryTemplate.setRetryPolicy(exRetryPolicy);

现在,我们需要使用这些回调来演示它们如何工作。 首先成功执行,这很简单:

// we do not catch anything hereSystem.out.println("\n*** Executing successfull callback...");retryTemplate.execute(new SuccessCallback(), new LoggingRecoveryCallback());

其输出如下:

*** Executing successfull callback...
Success callback: attempt 0

然后是异常

// we catch Exception to allow the program to continueSystem.out.println("\n*** Executing Exception callback...");try {retryTemplate.execute(new ExceptionCallback(), new LoggingRecoveryCallback());} catch (Exception e) {System.out.println("Suppressed Exception");}
*** Executing Exception callback...
Exception callback: attempt 0
Attempts exhausted. Total: 1
Last exception: Test Exception

最后是我们的IOException

// we catch IOException to allow the program to continueSystem.out.println("\n*** Executing IO Exception callback...");try {retryTemplate.execute(new SpecificExceptionCallback(), new LoggingRecoveryCallback());} catch (IOException e) {System.out.println("Suppressed IO Exception");}
*** Executing IO Exception callback...
IO Exception callback: attempt 0
IO Exception callback: attempt 1
IO Exception callback: attempt 2
Attempts exhausted. Total: 3
Last exception: Test IO Exception

如我们所见,只有IOException发起了三个尝试。 请注意,尝试次数从0开始编号,因为执行回调时尝试次数并未耗尽,因此上一次尝试次数为#2,而不是#3。 但是在RecoveryCallback上所有尝试均已用尽,因此上下文保留3次尝试。

我们还可以看到,尝试成功后未调用RecoveryCallback 。 也就是说,仅当执行以异常结束时才调用它。

RetryTemplate是同步的,因此所有执行都在我们的主线程中进行。 这就是为什么我在调用周围添加了try / catch块的原因,以使程序可以毫无问题地运行所有三个示例。 否则,重试策略将在上次失败尝试后将异常抛出,并停止执行。

还有一个非常有趣的CompositeRetryPolicy ,它允许添加几个策略并委托来依次调用它们。 它还可以允许创建相当灵活的重试策略,但这本身就是另一个主题。

我认为spring-retry是一个非常有用的库,它可以使常见的可重试任务更可预测,可测试且更易于实现。

翻译自: https://www.javacodegeeks.com/2017/07/spring-retry-winter-coming.html

春天猫rtsy

春天猫rtsy_春天重试,因为冬天来了相关推荐

  1. 春天猫rtsy_春天:注入列表,地图,可选对象和getBeansOfType()陷阱

    春天猫rtsy 如果您使用Spring框架超过一个星期,那么您可能已经知道此功能. 假设您有多个bean实现了给定的接口. 尝试仅自动连接此类接口的一个bean注定会失败,因为Spring不知道您需要 ...

  2. 春天猫rtsy_春天的时代

    春天猫rtsy 自从发布第一个版本以来,Spring便获得了成功. 这样一个未知的框架(当时)怎么可能变得如此广泛,以至于公司要求服务员拥有Spring知识? 我认为这是两个主要原因. 首先,使用In ...

  3. 春天猫rtsy_您最近见过春天吗?

    春天猫rtsy 开源应用程序框架Spring昨天在4.0版本中上线 . 被称为"在现代Java开发的最前沿保持Spring活力"的开发,经过改进的平台在设计时牢记了即将到来的Jav ...

  4. 春不语,春天却能催醒百花。

    春不语,春天却能催醒百花.花不语,花却能醉人心田.春天的记忆如白云朵朵,飘在记忆的天空.如河水清清流在记忆的心田.如树木郁郁长在记忆的旅途.如桃花朵朵开在记忆的春天.温暖记忆,永留一份欢乐.我相信在未 ...

  5. 春天重试,因为冬天来了

    好的,这实际上与冬天无关,众所周知,冬天已经到了 . 它是关于Spring Retry的,Spring是一个小的Spring框架库,它使我们可以将重试功能添加到应可重试的任何任务中. 这里有一个很好的 ...

  6. 2013中国手机的春天在哪里?

    转载,出自科幻星系 QQ:88328702 MSN:wangk1026@hotmail.com 2013的春天来了,树上的雪融化了,一切有生命的东西都忙着准备复苏,而那些终于熬过又一个寒冬的手机企业也 ...

  7. 制作手风琴效果的注意事项(附代码)

    hover的时候先统一所有再定义当前,注意先后顺序,例如: <!doctype html> <html> <head> <meta charset=" ...

  8. 计算机表格做八折怎么辛,原来古人的书信常用语那么美

    作为拥有5000年历史的文化大国 大中华在书信上的历史是非常久远的 基于汉语独特的语言体系 含蓄又有生活情趣的古人在书信中留下的 不止是情感.生活 这些书信本身就是后人进行文化研究的依据 也是临习书法 ...

  9. 诗词在线网络月刊2009年第五期

    诗词在线网络月刊2009年第五期 卷首语   诗词在线网络月刊2009年第五期终于要与大家见面了由于最近很忙,所以现在才出来,本期诗歌由会员自己推荐,版主筛选出来的诗歌,目前收录的诗歌还在整理中... ...

最新文章

  1. No module named ‘prompt_toolkit.enums‘
  2. Stanford CoreNLP使用需要注意的一点
  3. LINQ那些事儿(2)- 简单对象的CRUD操作和Association的级联操作
  4. fatal error: Python.h: 没有那个文件或目录 解决方法
  5. python pymysql_python使用pymysql实现操作mysql
  6. linux hbase 表大小,在Linux系统搭建hbase环境
  7. python函数设置默认参数_深入讲解Python函数中参数的使用及默认参数的陷阱
  8. Web安全入门笔记-XSS
  9. java课程设计 扫雷_java扫雷游戏课程设计报告
  10. FPGA源同步时钟输出
  11. 湖仓一体在金融科技行业的实践
  12. CTF-隐写术(三)
  13. python恶搞代码打开对方摄像头_用Python获取摄像头并实时控制人脸的实现示例
  14. python 安装spyder和问题
  15. [解决]Converting circular structure to JSON
  16. @Transactional(propagation)
  17. 空间直角坐标系(XYZ)转经纬度(BLH)
  18. 【Simulink+Prescan笔记】控件介绍
  19. 从 Spring Cloud 看一个微服务框架的五脏六腑
  20. 模拟手写手抄字体程序

热门文章

  1. [3.3训练赛]One-Dimensional(矩阵快速幂),Freda的迷宫(无向图强连通分量+并查集),一道防AK好题
  2. jzoj3832-在哪里建酿酒厂【指针】
  3. P4562-[JXOI2018]游戏【数论,组合数学】
  4. 2018 ACM-ICPC World Finals - Beijing
  5. codefoces 939E Maximize!好题
  6. Dubbo(六)之属性配置
  7. Sentinel(三)之如何使用
  8. Hadoop入门(十六)Mapreduce的单表关联程序
  9. 分布式 | Dubbo 架构设计详解
  10. 漫画:什么是中间人攻击