011 @Retryable的使用
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
2.配置类
只有启用@EnabelRetry才行,写在配置类或者启动类上都是可以的
package com.jun.web.config; import org.springframework.context.annotation.Configuration;
import org.springframework.retry.annotation.EnableRetry; @Configuration
@EnableRetry
public class RetryConfig {
}
3.服务类
一般将其加到服务类上就行,服务类一般写主要逻辑
package com.jun.web.annotation; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service; import java.time.LocalTime; @Service
public class PayService {
private Logger logger = LoggerFactory.getLogger(getClass()); private final int totalNum = 100000; @Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 2000L, multiplier = 1.5))
public int minGoodsnum(int num) throws Exception {
logger.info("减库存开始" + LocalTime.now());
try {
int i = 1 / 0;
} catch (Exception e) {
logger.error("illegal");
}
if (num <= 0) {
throw new IllegalArgumentException("数量不对");
}
logger.info("减库存执行结束" + LocalTime.now());
return totalNum - num;
} @Recover
public int recover(Exception e) {
logger.warn("减库存失败!!!" + LocalTime.now());
//记日志到数据库
return totalNum;
}
}
4.测试
package com.jun.web.annotation; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class PayController {
@Autowired
private PayService payService; @GetMapping("/retry")
public String getNum() throws Exception {
int i = payService.minGoodsnum(-1);
System.out.println("===="+i);
return "succeess";
}
}
5.结果
2019-08-23 10:27:46.702 DEBUG 16036 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet : GET "/retry", parameters={}
2019-08-23 10:27:46.702 DEBUG 16036 --- [nio-8080-exec-5] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to public java.lang.String com.jun.web.annotation.PayController.getNum() throws java.lang.Exception
2019-08-23 10:27:46.703 INFO 16036 --- [nio-8080-exec-5] com.jun.web.annotation.PayService : 减库存开始10:27:46.703
2019-08-23 10:27:46.703 ERROR 16036 --- [nio-8080-exec-5] com.jun.web.annotation.PayService : illegal
2019-08-23 10:27:48.703 INFO 16036 --- [nio-8080-exec-5] com.jun.web.annotation.PayService : 减库存开始10:27:48.703
2019-08-23 10:27:48.703 ERROR 16036 --- [nio-8080-exec-5] com.jun.web.annotation.PayService : illegal
2019-08-23 10:27:51.704 INFO 16036 --- [nio-8080-exec-5] com.jun.web.annotation.PayService : 减库存开始10:27:51.704
2019-08-23 10:27:51.704 ERROR 16036 --- [nio-8080-exec-5] com.jun.web.annotation.PayService : illegal
2019-08-23 10:27:51.704 WARN 16036 --- [nio-8080-exec-5] com.jun.web.annotation.PayService : 减库存失败!!!10:27:51.704
====100000
2019-08-23 10:27:51.704 DEBUG 16036 --- [nio-8080-exec-5] m.m.a.RequestResponseBodyMethodProcessor : Using 'text/html', given [text/html, application/xhtml+xml, image/webp, image/apng, application/signed-exchange;v=b3, application/xml;q=0.9, */*;q=0.8] and supported [text/plain, */*, text/plain, */*, application/json, application/*+json, application/json, application/*+json]
2019-08-23 10:27:51.704 DEBUG 16036 --- [nio-8080-exec-5] m.m.a.RequestResponseBodyMethodProcessor : Writing ["succeess"]
2019-08-23 10:27:51.705 DEBUG 16036 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet : Completed 200 OK
2019-08-23 10:27:51.714 DEBUG 16036 --- [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet : GET "/favicon.ico", parameters={}
2019-08-23 10:27:51.715 DEBUG 16036 --- [nio-8080-exec-6] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler [class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/], ServletContext resource [/], class path resource []]
2019-08-23 10:27:51.718 DEBUG 16036 --- [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet : Completed 200 OK
三:说明
1.@Retryable参数的意思说明
- value:抛出指定异常才会重试
- include:和value一样,默认为空,当exclude也为空时,默认所以异常
- exclude:指定不处理的异常
- maxAttempts:最大重试次数,默认3次
- backoff:重试等待策略,默认使用
@Backoff
,@Backoff
的value默认为1000L,我们设置为2000L;multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒。
2.Recover注解
四:注意事项
011 @Retryable的使用的更多相关文章
- Time.MONTH及Calendar.MONTH 默认的月份为 0-11
Time.MONTH及Calendar.MONTH 默认的月份为 0-11 所以使用的时候要自己加1.
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数011,ocr,字符识别
<zw版·Halcon-delphi系列原创教程> Halcon分类函数011,ocr,字符识别 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“p ...
- php大力力 [011节] PHP常量使用场景
2015-08-24 php大力力011. PHP常量使用场景 $root = "dali"; define("ROOT",10) echo "ROO ...
- [反汇编练习] 160个CrackMe之011
[反汇编练习] 160个CrackMe之011. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- spring boot / cloud (七) 使用@Retryable来进行重处理
spring boot / cloud (七) 使用@Retryable来进行重处理 前言 什么时候需要重处理? 在实际工作中,重处理是一个非常常见的场景,比如:发送消息失败,调用远程服务失败,争抢锁 ...
- AtCoder Grand Contest 011
AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...
- zookeeper连接 org.apache.curator.framework.imps.CuratorFrameworkImpl Background exception was not retry-able or retry gave up [main-EventThread]
ERROR org.apache.curator.framework.imps.CuratorFrameworkImpl Background exception was not retry-able ...
- 极客技术专题【011期】:EasyUI初级教程
来源:GBin1.com 技术专题:EasyUI初级教程 分享人:极客标签技术编辑 - html580(请站内关注分享人) 资深Web前端工程师,HTML580创始人,目前就职于广州一间软件公司.多年 ...
- 第011课_串口(UART)的使用
from: 第011课_串口(UART)的使用 第001节_辅线1_硬件知识_UART硬件介绍 1. 串口的硬件介绍 UART的全称是 Universal Asynchronous Receiver ...
随机推荐
- Node: 开发命令行程序英文版 (Create Your Own CLI)
CLI, as an abbreviation of Command-line Interface, can receive user's input and give an immediate re ...
- 构建nodejs环境
总想留下点东西,不负年华! 00.download releasehttps://nodejs.org/dist/ //all release example https://nodejs. ...
- 02-CSS常用样式
本篇主要介绍css的常用样式,以及网页布局相关知识.绝对定位和相对定位,盒子模型.css权重.以及css选择器: 绪论:CSS基本介绍 为了让网页元素的样式更加丰富,也为了让网页的内容和样式能拆分开, ...
- 乌班图安装Lnmp环境
1.nginx //切到root用户 sudo su //更新源 apt-get update //安装 apt-get install nginx //安装完成后配置文件目录 cd /etc/ngi ...
- centos7 hadoop 2.8安装
安装jdk https://www.cnblogs.com/syscn/p/9975049.html 下载hadoop wget http://mirrors.tuna.tsinghua.edu.cn ...
- .NET Core项目修改project.json来引用其他目录下的源码等文件的办法 & 解决多框架时 project.json 与 app.config冲突的问题
作者: zyl910 一.缘由 项目规模大了后,经常会出现源码文件分布在不同目录的情况,但.NET Core项目默认只有项目目录下的源码文件,且不支持“Add As Link”方式引入文件.这时需要手 ...
- np.mean()函数
1. 数组的操作: import numpy as np a = np.array([[1, 2], [3, 4]]) print(a) print(type(a)) print(np.mean(a) ...
- vue中点击不同的em添加class去除兄弟级class
vue中使用v-for循环li 怎么点击每个li中的em给添加class删除兄弟元素 <html lang="en"> <head> <meta ch ...
- Codeforces Round #605 (Div. 3) B. Snow Walking Robot(构造)
链接: https://codeforces.com/contest/1272/problem/B 题意: Recently you have bought a snow walking robot ...
- LeetCode 931. Minimum Falling Path Sum
原题链接在这里:https://leetcode.com/problems/minimum-falling-path-sum/ 题目: Given a square array of integers ...