SpringBoot AOP @AfterThrowing+自定义注解+自定义异常使用

2023-11-08

简介

利用SpringBoot AOP在程序抛出异常时执行对应的操作,在需要的方法上打上自定义的注解,在切面中进行配置。切面接收的参数就是就是抛出的异常,自定义异常存放数据。(适合抛出异常后要进行操作的情况)

自定义注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SyncData {
}

自定义异常

public class SyncDataException extends RuntimeException{

	/**
	 * 失败的impl实现类
	 */
	private SynChroBean synChroBean;
	/**
	 * 失败时第几次的循环
	 */
	private int index;
	/**
	 * 每页数量
	 */
	private int pageSize;

	/**
	 * 总页数
	 */
	private int totalPage;

	public SyncDataException(String message,SynChroBean synChroBean,int index,int totalPage,int pageSize) {
		super(message);
		this.synChroBean = synChroBean;
		this.index = index;
		this.pageSize = pageSize;
		this.totalPage = totalPage;
	}

	public SynChroBean getSynChroBean() {
		return synChroBean;
	}

	public int getTotalPage() {
		return totalPage;
	}

	public int getIndex() {
		return index;
	}

	public int getPageSize() {
		return pageSize;
	}
}

切面类

@Aspect
@Component
public class SyncDataAspect {


	@Autowired
	private DynamicThirdDataSourceService dynamicThirdDataSourceService;


	@AfterThrowing(throwing="ex",pointcut="@annotation(SyncData)")
	public void doRecoveryActions(SyncDataException ex){

		//在这里重试调用
		SyncDataException syncDataException = ex;
		int index = syncDataException.getIndex();
		SynChroBean synChroBean = syncDataException.getSynChroBean();
		int pageSize = syncDataException.getPageSize();
		int totalPage = syncDataException.getTotalPage();
		dynamicThirdDataSourceService.synchroData(synChroBean,index,totalPage,pageSize);
	}

}

使用

@SyncData  //配置自定义注解
	public void synchroData(SynChroBean synChroBean,int index,int totalPage,int pageSize) {
		//找到对应的ServiceImpl class
		Class serviceImplClass = synChroBean.getClazz();
		//获取bean容器中配置类Mapper的实例
		Object ThirdDataSourceMapper = context.getBean(DynamicThirdDataSourceMapper.class);
		//获取bean容器中ServiceImpl的实例
		TableOperateMethod tableOperateMethod = (TableOperateMethod) context.getBean(serviceImplClass);
		int j = 0;
		try {
			for (int i = index; i <= totalPage; i++) {
				j = i;
				//查询出第三方表的数据List
				List dataList = (List) synChroBean.getMethod().invoke(ThirdDataSourceMapper, pageSize, i*pageSize);
				tableOperateMethod.execute(dataList,false);
			}
			//同步后删除旧数据
			tableOperateMethod.deleteOldData();
		} catch (Exception e) {
			try {
				Thread.sleep(10000);
			} catch (InterruptedException interruptedException) {
				interruptedException.printStackTrace();
			}
			//抛出自定义异常,被切面捕获
			throw new SyncDataException(e.getMessage(),synChroBean,j,totalPage,pageSize);
		}
	}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot AOP @AfterThrowing+自定义注解+自定义异常使用 的相关文章

随机推荐

  • error while loading shared libraries: libcudart.so.9.1:cannot open shared object file: No such file

    在实现YOLO目标检测时 出现如下错误 error while loading shared libraries libcudart so 9 1 cannot open shared object file No such file 解决
  • 中国高房价时期it从业人员指导工资简易计算公式-国标(GB54321)

    版权所有 瞿正峰 转载请保留版权声明 http blog csdn net gonxi 中国高房价时期it从业人员指导工资简易计算公式 在线计算器 http www gonxi com 快去算算你的工资 A 10年期间的平均每月工资 Wa
  • v1

    func size 179844 size data 7854BB174689C0DB2EEE7C23D2A0C6BD91EFF7DE6766930B1E5882849BFAF293 A7633CDAD850DC3F469E91E72199
  • 丢掉Excel,手把手教你用Python做可视化,还能调节动画丝滑度

    数据可视化动画还在用Excel做 现在一个简单的Python包就能分分钟搞定 而且生成的动画也足够丝滑 效果是酱紫的 这是一位专攻Python语言的程序员开发的安装包 名叫Pynimate 目前可以直接通过PyPI安装使用 使用指南 想要使
  • Python>>SQL我只写复制粘贴的

    介绍 写sql字段太多核对编写起来太累了 公司项目又紧 一星期3000多行sql 要各种转换调用各种接口 所以为了提高工作效率 争取更多时间 摸鱼 我就用python了 相对于其它重复的敲小伙伴 我就直接飞起 现向大家展示个人比较常用的编写
  • Redis高级特性:虚拟内存的使用技巧

    首先说明下redis的虚拟内存与操作系统的虚拟内存不是一码事 但是思路和目的都是相同的 就是暂时把不经常访问的数据从内存交换到磁盘中 从而腾出宝贵的内存空间用于其他需要访问的数据 尤其是对于redis这样的内存数据库 内存总是不够用的 除了
  • 五个方向告诉你如何运营好一个公众号!

    来源 新媒之家 内容运营到底要怎么做呢 本文作者结合经验从选题 内容 编辑 目的 传播五个方面浅谈了内容运营应该如何做 希望对你有所帮助 运营一个公众号很简单 但运营好公众号却太难 好与坏的评判关键在于内容 内容越优质 用户粘性自然越强 口
  • “拍领导马屁,升职加薪无戏”

    在知乎上看到这样一个提问 怎么现在的年轻人都不愿意讨好领导了 看完我忍不住笑了 我刚入职场那会儿 总能看到 前辈 透露给年轻人一些职场潜规则 不懂揽活讨好领导 没有进取心 多分给你杂务 那是领导考验你 要学会忍耐 这些 经验 拿到现在 受到
  • ImportError: cannot import name 'ImmutableDict' from 'werkzeug'

    ImportError cannot import name ImmutableDict from werkzeug 当出现这个错的时候 可以使用下面这个命令降级安装就可以了 pip install upgrade werkzeug 0 1
  • C++算法之递归

    在函数内部直接或间接调用自身的程序定义为递归定义 递归可以解决一些问题 如遍历树和搜索算法等问题 递归通常把一个大型复杂的问题转化为一个规模较小的问题来求解 大大减少了程序的代码量 下面会介绍递归 目录 1 条件 2 例 3 例题 3 1
  • 慢sql优化

    SQL 优化一般步骤 通过慢查日志等定位那些执行效率较低的 SQL 语句 explain 分析SQL的执行计划 需要重点关注 type rows filtered extra type 由上至下 效率越来越高 ALL 全表扫描 index
  • STM32F103ZET6【HAL函开发】--安装STM32CUBEMX

    安装STM32CUBEMX大概可以分成三步 1 安装JRE 因为 STM32CubeMX是运行在Java环境下的 所以需要按照JRE Java Runtime Environment 2 安装STM32CubeMX 3 安装HAL库 可以选
  • rk3288 6222b 模组调试 (rtl8822cs)--wifi

    rtl8822cs 模块 wifi调试 记录 任务 在rk3288 android7 1 上移植配置 rtl8822cs 的wifi模块 思路 将厂商给的 wifi 驱动换上 并在 内核中 修改对应 makefile 和 Kconfig 以
  • Chasedb1--视网膜血管分割数据集

    Overview Chasedb1 是一个轻量的用于视网膜血管分割的图像数据集 其用于识别和自动分类关键的视网膜特征 分析视网膜血管形态与视网膜及全身性疾病的关系 以便在疾病处于早期阶段时得到及时检测和治疗 Data Explore 从云盘
  • 永磁同步电机矢量控制(九)——三闭环位置控制系统

    恰饭一下 已经过了工作的年纪 在这里稍微出一下自己做的一套永磁同步电机的教程 为了解决电机控制入门难的问题 我将自己从一知半解到现在的学习记录整理成十个部分学习教程 从基础的矢量控制 到应用性较强的MTPA 弱磁控制等 最后深入到无速度传感
  • k8s初级实战13--资源限制

    k8s初级实战13 资源限制 1 介绍 2 资源限制用法 2 1 内存限制 2 2 cpu限制 2 3 命名空间配额 2 4 pv容量限制 3 注意事项 4 说明 1 介绍 k8s 中常见的资源限制包括 内存 cpu pv容量 pod数量等
  • C# Lock锁

    lock 关键字可以用来确保代码块完成运行 而不会被其他线程中断 它可以把一段代码定义为互斥段 critical section 互斥段在一个时刻内只允许一个线程进入执行 而其他线程必须等待 这是通过在代码块运行期间为给定对象获取互斥锁来实
  • 如何安装nvm(nvm 安装教程)

    如何安装nvm nvm 安装教程 一 nvm是什么 nvm是一个node的版本管理工具 可以简单操作node版本的切换 安装 查看等等 与npm不同的是 npm是依赖包的管理工具 二 安装nvm 1 nvm下载地址 https github
  • NDk AndRoid

    史上最全系列之开发环境搭建之NDK 2 作者 sk 更新于 06月01日访问 3432 评论 29 前言 由于Monica 小MM 一篇 史上最全Android开发环境搭建 一下子就包含了jdk android sdk ADT 等都包含了下
  • SpringBoot AOP @AfterThrowing+自定义注解+自定义异常使用

    简介 利用SpringBoot AOP在程序抛出异常时执行对应的操作 在需要的方法上打上自定义的注解 在切面中进行配置 切面接收的参数就是就是抛出的异常 自定义异常存放数据 适合抛出异常后要进行操作的情况 自定义注解 Target Elem