# spring-retry-plus **Repository Path**: zzjzzy/spring-retry-plus ## Basic Information - **Project Name**: spring-retry-plus - **Description**: spring-retry框架扩展,支持将异常重试信息持久化到数据库 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-13 - **Last Updated**: 2025-12-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 基于spring-retry框架扩展的retry实现,在spring-retry基础上,如果重试失败,会将失败信息保存到数据库,用于后续定时任务扫描重试。 ## 模块说明 ### retryplus-demo 使用@RetryablePlus示例,使用时可参考此示例。 ### spring-retry-plus 实现对RetryListener的扩展,重试记录的保存基于com.github.gitcat.spring.retryplus.persistent.BeanRetryInfoRepository接口实现, 默认实现在retryplus-mybatisplus模块中,基于mybatisplus保存到mysql,如果业务有自己的保存方式,可自行实现BeanRetryInfoRepository接口,并将实现类注册为spring bean。 ### retryplus-mybatisplus 基于mybatisplus的重试记录保存实现 ## 用法 为避免和业务项目中依赖冲突,本项目大部分maven依赖配置的都是`true`,如果发现java.lang.ClassNotFoundException异常,可自行引入相关jar包 大部分情况下,如果你使用的是spring框架,业务项目依赖的jar包已经可以满足要求。 ### 引入依赖 ```xml com.github.gitcat spring-retry-plus 最新版本号 com.github.gitcat retryplus-mybatisplus 最新版本号 ``` ### 新建数据库 如果不使用默认实现的retryplus-mybatisplus,这一步可以不做。 异常调用信息会保存到数据库,用于后续定时任务扫描重试 ```sql CREATE TABLE `bean_retry_record` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键,自增', `retry_times` int(11) DEFAULT '0' COMMENT '已重试次数', `max_retry_times` int(11) DEFAULT '0' COMMENT '允许的最大重试次数', `bean_class` varchar(255) DEFAULT '' COMMENT '需要重试的bean类', `bean_method` varchar(255) DEFAULT '' COMMENT '需要重试的bean方法', `param_values` text COMMENT '重试需要的参数', `method_param_types` text COMMENT '方法定义的参数类型', `real_param_types` text COMMENT '实际传入的参数类型', `exception_msg` text COMMENT '异常信息', `retry_result` int(11) DEFAULT '0' COMMENT '重试结果', `next_retry_timestamp` bigint(20) DEFAULT NULL COMMENT '下次重试时间,毫秒时间戳', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Bean重试记录表'; ``` ### 配置定时任务 定时任务可以根据情况自行配置,通过定时任务调用com.github.gitcat.spring.retryplus.service.RetryService.retryAll来实现重试。 如果业务对于重试有自己的个性化需求(比如执行重试前设置traceId),可通过覆写RetryService.retryAll,或者自行实现重试方式。 ### 代码中使用 #### 配置 - 配置文件中开启功能 spring.retryplus.enable=true - 启动类上加@EnableRetry #### 在需要重试的方法上添加@RetryablePlus注解 该注解继承了spring的@Retryable注解,用法和spring的@Retryable一致。 使用@RetryablePlus注解后,表现如下 - 如果在maxAttempts次数内重试失败,则会将失败信息及调用方法等信息保存到数据库,用于后续定时任务扫描重试。 - 如果在maxAttempts次数内重试成功,则不会保存失败信息 - 定时任务重试时,会再次调用@RetryablePlus注解的方法,如果重试成功,标记数据库记录重试成功。如果重试失败,计算下次重试时间并将重试次数加1,更新重试记录。 - 当定时任务重试次数达到RetryablePlus.dbRetryTimes次数后或者重试成功后,不会再进行重试。 #### 使用限制 因为要序列化方法参数为string以便保存到数据库,且需要从string反序列化为java对象,所以方法参数必须支持序列化反序列化。 此处所说序列化反序列化是指com.github.gitcat.spring.retryplus.serializer.ParamSerializer支持的序列化反序列化方式。 如果已有序列化实现无法满足要求,可自行实现com.github.gitcat.spring.retryplus.serializer.ParamSerializer
不支持@Async和@RetryablePlus同时使用,原因请查看com.github.gitcat.spring.retryplus.listener.RetryPlusListener.close注释。