1、数据库表设计
CREATE TABLE `crl_notify_record` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`notice_owner` varchar(30) NOT NULL COMMENT '通知发起方的简称',
`notice_owner_serial` varchar(80) NOT NULL COMMENT '通知发起序列号',
`notice_accepter` varchar(30) NOT NULL COMMENT '通知接收方简称',
`notify_url` varchar(300) NOT NULL COMMENT '通知地址,http(s)://……',
`notify_content` text COMMENT '通知内容:明文json串',
`notify_send_content` text COMMENT '通知发送内容,有可能加密',
`retry_count` int NOT NULL DEFAULT '20' COMMENT '通知重试次数,默认值:20',
`notify_count` int NOT NULL DEFAULT '0' COMMENT '已通知次数',
`last_notify_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最近处理时间,初始值与“下次通知时间”一致,每次拉取处理时变更。(可以推断出与预计处理时间的差距)',
`next_notify_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '下次通知时间,计算公式暂定:当前时间 + (n+5)*n^2.(n的单位:秒)',
`delay_time` int NOT NULL DEFAULT '0' COMMENT '处理延时,单位:秒,处理延时,即“当前时间-下次通知时间”,用来看通知时效性',
`send_status` varchar(20) NOT NULL DEFAULT 'INIT' COMMENT '通知送达状态(http响应码为200则认为通知成功).初始化:INIT;处理中:PROCESSING;成功:SUCCESS;未知:UNKNOWN;待处理:PRE_PROCESSING',
`ret_type` varchar(10) NOT NULL DEFAULT 'RETCON' COMMENT '通知方对通知回执的需求类型.无需回执(默认):NONE;通知送达回执(接收方http响应200):SENDED;通知应答回执(接收方应答的信息):RETCON',
`ret_content` varchar(512) DEFAULT NULL COMMENT '通知接收方返回的通知应答内容',
`notice_priority` int(11) NOT NULL DEFAULT '0' COMMENT '默认值:0,数值越大优先级越高',
`created_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modified_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_notice_owner` (`notice_owner`,`notice_owner_serial`) USING BTREE,
KEY `idx__query` (`send_status`,`next_notify_time`,`notice_priority`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='统一通知记录表';
2、代码逻辑:
2.1 加重试机制的分布式锁
2.2 扫描状态为初始化或待执行且发送时间小于当前时间的100条记录,按优先级排序。
2.3 批