说明
多活部署springboot应用,程序内有心跳机制,使用定时任务去更新表里面的系统的存活时间。
代码(说明见注释)
DROP PROCEDURE IF EXISTS updHealth;
delimiter /endAll/
CREATE PROCEDURE updHealth ( ) BEGIN
-- 声明变量
-- 异常标识
DECLARE flag int DEFAULT 0;
-- 临时字段,中间结果使用
DECLARE tmpnum int DEFAULT 0;
-- 查询不正常标识
select deleted into flag from system_health;
-- 查询心跳时间在30s之内的系统数 为0表示所有系统都不正常
select count(1) into tmpnum from system_health_heart
Where update_time+30*1000 > REPLACE(unix_timestamp(current_timestamp(3)),'.','');
-- 所有系统都不正常,而标示正常
IF tmpnum = 0 AND flag = 0 THEN
Update system_health set deleted = 1;
END IF;
-- 有系统正常,而标示不正常
IF tmpnum > 0 AND flag = 1 THEN
Update system_health set deleted = 0,update_time=(select max(update_time) from system_health_heart);
END IF;
END
/endAll/
delimiter;
使用该方法
delimiter /endAll/
DROP EVENT IF EXISTS updSystemHealth;
CREATE EVENT IF NOT EXISTS updSystemHealth
-- 每5秒执行一次
ON SCHEDULE EVERY 30 SECOND
-- 执行完成后保留(对应删除)
ON COMPLETION PRESERVE
-- 执行完成后直接开始运行
ENABLE
COMMENT '刷新系统健康运行时长'
-- 实际行为
DO
call updHealth();
/endAll/
delimiter;
最后
到此事件就创建成功了,但是默认状态事件是不执行的,可用sql查看
SHOW VARIABLES LIKE ‘event_scheduler’;
OFF表示关闭。
我们使用 sql去开启事件执行
SET GLOBAL event_scheduler = ON;
到此就可以定时执行执行的过程。