流程图:
数据库设计(初步设计):
CREATE TABLE `retry` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`method_name` tinyint(1) DEFAULT NULL COMMENT '请求方法: 1.get 2.post',
`url` varchar(255) DEFAULT NULL COMMENT '请求url',
`param` varchar(255) DEFAULT NULL COMMENT '请求参数',
`header` varchar(255) DEFAULT NULL COMMENT '请求头',
`amount` int(11) DEFAULT '0' COMMENT '请求次数',
`status` tinyint(1) DEFAULT '0' COMMENT '状态: 0. 进行中 1.完成 2.失败',
`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
KEY `index_status_amount` (`status`,`amount`) USING BTREE COMMENT '状态&重试次数索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
其他细节:
1. 利用spring-retry(@Retryable)进行初步请求重试,请求时间间隔第一次10秒,第二次20秒
2. 失败后将请求地址,请求头,请求参数等信息持久化进入数据库(重试次数此时为0)
3. 定时任务每五分钟查询数据库中状态为进行中,重试次数小于等于3次的数据,利用线程池异步执行同步操作
4. 失败三次后将状态修改为同步失败,后续通过日志查询并解决问题
demo github地址:
GitHub - wzhkid1001/Http-retry
待解决问题:
如果同步失败,是继续执行开启session,还是不再开启直到同步问题解决