springboot整合aop实现自定义注解-方法运行异常重试demo

1.依赖引入

<dependency>
    <groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2.自定义注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @Author: deng
 * @Date: 2024/3/26 16:10
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Retry {
    /**
     * 默认重试3次
     * @return
     */
    int times() default 3;
}

3.切面类

package com.example.per.aop;

import com.example.per.annotation.Retry;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
 * @Author: deng
 * @Date: 2024/3/26 16:12
 */
@Component
@Aspect
@Slf4j
public class RetryAspect {

    @Pointcut(value = "@annotation(com.example.per.annotation.Retry)")
    public void retryPoint() {
    }

    @Around(value = "retryPoint()")
    public void around(ProceedingJoinPoint joinPoint) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        String methodName = method.getName();
        Retry retry = method.getAnnotation(Retry.class);
        int times = retry.times();
        boolean isRetry = false;
        for (int i = 1; i < times + 1; i++) {
            try {
                joinPoint.proceed();
                isRetry = true;
            } catch (Throwable throwable) {
//                throwable.printStackTrace();
                log.info("method:{} run error:{}", methodName, throwable.getMessage());
                log.info("3 seconds run retry,  {} times", i);
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            if (isRetry) break;
        }
    }
}

4.task

package com.example.per.task;

import com.example.per.annotation.Retry;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * @Author: deng
 * @Date: 2024/3/26 16:34
 */
@Component
public class TestTask {

    @Scheduled(cron = "0/5 * * * * ?")
    @Retry
    public void test20240326(){
        int i = 10/0;
    }
}

5.run

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

简易电路设计,PW1605芯片实现24V/30V/48V限流过压保护功能

一般描述 PW1605 是一款电流限制开关&#xff0c;具有可编程输入过压保护和输出电压箝位功能。集成保护 N 沟道 FET 具有极低的 RDS&#xff08;ON&#xff09; 功能&#xff0c;PW1605有助于降低正常工作期间的功率损耗。可编程软启动时间控制启动期间输出电压的压摆率。独立的…

【LV15 day14 中断处理:按键驱动程序编写】

一、什么是中断 一种硬件上的通知机制&#xff0c;用来通知CPU发生了某种需要立即处理的事件 分为&#xff1a; 内部中断 CPU执行程序的过程中&#xff0c;发生的一些硬件出错、运算出错事件&#xff08;如分母为0、溢出等等&#xff09;&#xff0c;不可屏蔽外部中断 外设发…

一、SpringBoot3 介绍

本章概要 SpringBoot3 简介系统要求快速入门入门总结 1.1 SpringBoot3 简介 此处使用 SpringBoot 版本&#xff1a;3.0.5 https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html 无论使用XML、注解、Java配置类还是他们的混合用法&#xff0…

C语言学习--字符串和整型的转换

目录 整型→字符串 方法1&#xff1a;利用‘0’将单个数字转字符 方法2&#xff1a;利用sprintf函数 方法3&#xff1a;利用itoa函数 字符串→整型 方法1&#xff1a;利用-‘0’直接转换 方法2&#xff1a;利用atoi函数 整型→字符串 整形数据变成字符串&#xff0c;最…

数据结构从入门到精通——归并排序

归并排序 前言一、归并排序的基本思想二、归并排序的特性总结三、归并排序的动画展示四、递归实现归并排序的具体代码展示五、非递归实现归并排序 前言 归并排序是一种分治策略的排序算法。它将一个序列分为两个等长&#xff08;几乎等长&#xff09;的子序列&#xff0c;分别…

百度百科审核不通过全攻略,一看就会!

在撰写百度百科词条时&#xff0c;遇到审核不通过的情况可能会让人感到沮丧。然而&#xff0c;我们并不需要灰心&#xff0c;而是要通过一些方法来改善文章质量&#xff0c;使其符合百度百科的要求。腾轩科技传媒分享百度百科审核不通过全攻略&#xff0c;一看就会&#xff01;…

Docker Stack(堆栈) 部署多服务集群,多服务编排

1、Docker Stack简介 Docker Stack(堆栈) 是在 Swarm 上管理服务堆栈的工具。而在以前文章docker swarm集群搭建 介绍的 Docker Swarm 只能实现对单个服务的简单部署&#xff0c;于是就引出了Docker Stack。 上面我们介绍到 docker-compose&#xff1a;可以在一台机器上使用…

出差补助怎么发放更高效省心?这套攻略快看看

交补、餐补、话补等各类补助场景分散&#xff0c;无法实现一站式统筹管理。不仅如此&#xff0c;补贴核算也总是需要员工提供各类凭证&#xff0c;经过财务反复核实才能发放……出差发放补助原本是为了传递企业关怀&#xff0c;鼓励员工积极出差&#xff0c;由于发放和管理不当…

6 Spring-AOP

文章目录 1&#xff0c;AOP简介1.1 什么是AOP?1.2 AOP作用1.3 AOP核心概念 2&#xff0c;AOP入门案例2.1 需求分析2.2 思路分析2.3 环境准备2.4 AOP实现步骤步骤1:添加依赖步骤2:定义接口与实现类步骤3:定义通知类和通知步骤4:定义切入点步骤5:制作切面步骤6:将通知类配给容器…

新能源电车充电桩运营管理分析

摘要&#xff1a;近年来&#xff0c;我国大力推进新能源公共交通的发展&#xff0c;制定了一系列相关政策法规。作为公共充电设施的新能源充电桩也得到了发展和普及&#xff0c;其在新能源领域发挥着重要的保障作用。在当前&#xff0c;充电桩的管理还存在许多短板&#xff0c;…

MySql实战--全局锁和表锁 :给表加个字段怎么有这么多阻碍

今天我要跟你聊聊MySQL的锁。数据库锁设计的初衷是处理并发问题。作为多用户共享的资源&#xff0c;当出现并发访问的时候&#xff0c;数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。 根据加锁的范围&#xff0c;MySQL里面的锁大致可以分成…

开放式耳机性价比高的品牌有哪些呢?五大高性价比选购清单

不入耳开放式蓝牙耳机近两年开始火起来了&#xff0c;因为它佩戴的舒适性和安全性两方面受到了很多人的关注。开放式的设计&#xff0c;就算不放进耳朵里也能听歌&#xff0c;同时加上它独特的空气传导的传声途径&#xff0c;整体的音质还是很不错的。不压耳&#xff0c;不涨耳…

Redis 6.0.8版本下载

简介&#xff1a;Java领域优质创作者楠木 分享Java项目、简历模板、学习资料、面试题库 想必大家在下载redis之前已经逛了很多教程了&#xff0c;可能不尽如意&#xff0c;找不到自己的想要的版本。既然刷到了我的这条博客&#xff0c;说明你是幸运的&#xff01; Redis6.0.8的…

【Godot4自学手册】第二十七节自定义状态机完成看守地宫怪物

本节&#xff0c;我将使用自定义状态机实现看守地宫怪物&#xff0c;完成了基础类State&#xff0c;状态机类StateMachine的编码&#xff0c;实现了怪物的闲置巡逻类、追踪类和攻击类&#xff0c;以及对应动画等。这节代码有点多&#xff0c;不过还好&#xff0c;代码比较简单。…

C语言 汉诺塔问题

目录 1.前言 2.问题描述 3.问题分析 4.定义一个主函数 5.再定义一个hanoi函数 6.所有代码 7.结语 1.前言 汉诺塔问题&#xff0c;是心理学实验研究常用的任务之一。该问题的主要材料包括三根高度相同的柱子和一些大小及颜色不同的圆盘&#xff0c;三根柱子分别为起始柱A…

大数据入门(一)

大数据主要要解决&#xff1a;海量数据的采集&#xff0c;存储&#xff0c;分析计算问题。 大数据的特点&#xff1a;大量&#xff08;数据量大&#xff09;&#xff0c;高速&#xff08;数据量的累积越来越快&#xff09;&#xff0c;多样&#xff08;结构化数据和非结构化数…

基于nodejs+vue医院综合管理系统实现与设计python-flask-django-php

第一&#xff0c;研究分析当下主流的nodejs技术&#xff0c;结合医院日常管理方式&#xff0c;进行医院综合管理系统的数据库设计&#xff0c;设计医院综合管理系统功能&#xff0c;并对每个模块进行说明。 第二&#xff0c;陈列说明该系统实现所采用的架构、系统搭建采用的服务…

【办公类-50-01】20240326判断随机写的“日期”是否是双休日

背景需求&#xff1a; 领导让我做设计本学期的科研培训方案。 我在2-6月随机写每月的培训日期&#xff0c;重新制定了主题 因为科研培训不可能在双休日&#xff0c;因此我希望本次活动的随机写的日期&#xff0c;不能是双休日。 我想用Python判断一下这些预设的日期是否是双休…

SpringBoot—@ConditionalOnBean与@ConditionalOnClass

一、ConditionalOnBean概念 需求场景 比如下面一种场景&#xff0c;我在实例化People对象的时候&#xff0c;需要注入一个City对象。这个时候问题来了&#xff0c;如果city没有实例化&#xff0c;那么下面就会报空指针或者直接报错。 所以这里需求很简单&#xff0c;就是当前c…

JS加密解密之应用如何保存到桌面书签

前言 事情起因是这样的&#xff0c;有个客户解密了一个js&#xff0c;然后又看不懂里边的一些逻辑&#xff0c;想知道它是如何自动拉起谷歌浏览器和如何保存应用到书签的&#xff0c;以及如何下载应用的。继而诞生了这篇文章&#xff0c;讲解一下他的基本原理。 渐进式Web应用…
最新文章