SpringBoot(1.5.4)集成spring-retry步骤

1.在启动类上增加注解(proxyTargetClass=true表示使用cglib代理)
@EnableRetry(proxyTargetClass=true)

2.需要重试的方法必须要单独写在一个service里面(就是调用和被调用不能写在同一个类里面)

@Service("sendEmailService")
public class SendEmailService {

    private final Logger log = LoggerFactory.getLogger(SendEmailService.class);

    @Autowired
    private RestTemplate restTemplate;
    // 邮件发送计数器
    int count = 0;

    /**
     * 这是发送Excel到邮件的方法
     * @param subject 邮件主题
     * @param text 邮件正文
     * @param to 收件人,多个用英文逗号分隔
     * @param resource 邮件附件
     * @throws RestClientException 调用接口不通返回的异常
     */
    @Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 2000L, multiplier = 1.5))
    // maxAttempts 表示调用次数,delay表示重试延迟,multiplier表示指定延迟的倍数
    public void sendEmail(String subject, String text, String to, FileSystemResource resource) throws RestClientException {
        // 异常必须抛出去,不能try-catch
        log.info("正在尝试第" + ++count + "/3次发送");
        MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
        // 封装邮件主题
        param.add("subject", ZWDateUtil.getDate() + subject);
        // 封装邮件内容
        param.add("text", text);
        // 封装邮件附件
        param.add("files", resource);
        // 封装邮件收件人
        param.add("to", to);
        MimeMailMessage mimeMailMessage = restTemplate.postForObject("http://xxx-service/api/xxxController/xxxMimeMail", param, MimeMailMessage.class);
        if ("ok".equals(mimeMailMessage.getStatus())) {
            // 重置计数器
            count = 0;
            log.info("自动发送成功");
        } else {
            log.error("自动发送失败");
            throw new RestClientException("状态不是OK,手动抛出异常!");
        }

    }

 /**
     * 这是一个兜底的方法,尝试次数达到上限之后会进入这个方法
     *
     * @param resource 封装的Excel附件
     */
    @Recover
    public void recover(RestClientException e) {
        // 重置计数器
        count = 0;
        log.error("三次尝试发邮件均失败");
    }
}

3.在需要调用重试方法的类的注入service,然后xxxService.sendEmail(xxx,xxx,xxx,xxx)直接调用即可

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 准备好好看看一下spring-cloud的源码,把其中实现的原理搞清楚,而不是仅仅会配几个注解,会配几个参数,把“...
    沉寂之舟阅读 14,934评论 0 6
  • IoC 容器 Bean 的作用域 自定义作用域实现 org.springframework.beans.facto...
    Hsinwong阅读 7,231评论 0 7
  • IOC 控制反转容器控制程序对象之间的关系,而不是传统实现中,有程序代码之间控制,又名依赖注入。All 类的创建,...
    irckwk1阅读 4,585评论 0 0
  • 方便面最好吃的记忆是小时候,邻居住院回来到他家去分给我吃的,当初还是两个调料包呢,很没有见识的!再后来在学校的时候...
    大灰熊的树袋熊阅读 1,287评论 0 0
  • 分享yu-yu的单曲《星屑の砂時計》http://music.163.com/song/30780536?user...
    喝露露阅读 4,132评论 2 1