diff options
| author | shizhendong <[email protected]> | 2023-07-11 18:14:22 +0800 |
|---|---|---|
| committer | shizhendong <[email protected]> | 2023-07-11 18:14:22 +0800 |
| commit | 7ff7c1d2c49f9d379a28bbade4ce08557743294e (patch) | |
| tree | 4ff6860035f66887b88fbe18b7d7a8e464626371 | |
| parent | ad04d58d8a11dd4090e0f146b444a2148bcccd92 (diff) | |
fix: NEZ-2936 修复告警规则有效时间内未生效问题
1. 创建 Judge 线程前判断是否在生效周期内
2. 修改 rule 时,根据生效周期修改 state
3 files changed, 97 insertions, 27 deletions
diff --git a/nz-admin/src/main/java/com/nis/modules/alert/backend/AlertRuleManagerJob.java b/nz-admin/src/main/java/com/nis/modules/alert/backend/AlertRuleManagerJob.java index 0d1063fe..46c0e158 100644 --- a/nz-admin/src/main/java/com/nis/modules/alert/backend/AlertRuleManagerJob.java +++ b/nz-admin/src/main/java/com/nis/modules/alert/backend/AlertRuleManagerJob.java @@ -16,9 +16,11 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.scheduling.quartz.QuartzJobBean; import org.springframework.stereotype.Component; -import java.util.Calendar; -import java.util.*; +import java.util.List; +import java.util.Map; import java.util.Map.Entry; +import java.util.Set; +import java.util.TimeZone; /** * 所有 nz-web 实例都执行此定时任务 @@ -171,6 +173,7 @@ public class AlertRuleManagerJob extends QuartzJobBean { JobKey jobKey = this.getAlertRuleJudgeJobKey(newHash, rule.getId()); // 开启job boolean exists = scheduler.checkExists(jobKey); + log.info("create alert rule judge, ruleId: {},exists: {}", rule.getId(), exists); if (!exists) { JobDataMap dataMap = new JobDataMap(); dataMap.put(AlertContext.JOB_DATA_KEY_ALERT_RULE_ENTITY, rule); @@ -178,16 +181,26 @@ public class AlertRuleManagerJob extends QuartzJobBean { .storeDurably().setJobData(dataMap).build(); // 设置执行周期 SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.repeatSecondlyForever(rule.getInr()); - SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger() - .forJob(jobDetail) - .withIdentity(jobKey.getName(), jobKey.getGroup()) - .withSchedule(scheduleBuilder) - .startAt(Tool.DateUtil.date(System.currentTimeMillis() + Tool.RandomUtil.randomInt(10, 60)*1000)) //加入随机时间,分散alert rule 执行时间 - .build(); - // 创建任务 - scheduler.scheduleJob(jobDetail, simpleTrigger); + SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger() + .forJob(jobDetail) + .withIdentity(jobKey.getName(), jobKey.getGroup()) + .withSchedule(scheduleBuilder) + .startAt(Tool.DateUtil.date(System.currentTimeMillis() + Tool.RandomUtil.randomInt(10, 60) * 1000)) //加入随机时间,分散alert rule 执行时间 + .build(); + // 定时任务是否开启 + if (Tool.ObjectUtil.equal(1, rule.getSchedEnable())) { + // 任务是否在执行周期内 + boolean isTaskInSched = ruleService.isTaskInSched(rule); + if (isTaskInSched) { + scheduler.scheduleJob(jobDetail, simpleTrigger); + } + log.info("create alert rule judge finshed, ruleId: {}, isTaskInSched: {}", rule.getId(), isTaskInSched); + } else { + // 创建任务 + scheduler.scheduleJob(jobDetail, simpleTrigger); + log.info("create alert rule judge finshed, ruleId: {}", rule.getId()); + } } - log.info("create alert rule judge, ruleId: {},exists: {}", rule.getId(), exists); } } } @@ -309,7 +322,8 @@ public class AlertRuleManagerJob extends QuartzJobBean { JobDetail jobDetail = JobBuilder.newJob(AlertRuleScheduleJob.class).withIdentity(onJobKey).storeDurably() .build(); String jobCronExpression = this.genCron(rule.getSchedStime(), rule.getSchedDays()); - CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(jobCronExpression); + String timezone = configService.getValue("timezone"); + CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(jobCronExpression).inTimeZone(TimeZone.getTimeZone(timezone)); CronTrigger cronTrigger = TriggerBuilder.newTrigger().forJob(jobDetail).withSchedule(cronScheduleBuilder) .build(); // 创建任务 @@ -322,7 +336,8 @@ public class AlertRuleManagerJob extends QuartzJobBean { JobDetail jobDetail = JobBuilder.newJob(AlertRuleScheduleJob.class).withIdentity(offJobKey).storeDurably() .build(); String jobCronExpression = this.genCron(rule.getSchedEtime(), rule.getSchedDays()); - CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(jobCronExpression); + String timezone = configService.getValue("timezone"); + CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(jobCronExpression).inTimeZone(TimeZone.getTimeZone(timezone)); CronTrigger cronTrigger = TriggerBuilder.newTrigger().forJob(jobDetail).withSchedule(cronScheduleBuilder) .build(); // 创建任务 @@ -331,7 +346,6 @@ public class AlertRuleManagerJob extends QuartzJobBean { } /** - * * @param time 时间,00:00 * @param days 星期,多个逗号分隔 * @return @@ -339,18 +353,8 @@ public class AlertRuleManagerJob extends QuartzJobBean { public String genCron(String time, String days) { if (Tool.StrUtil.isAllNotBlank(time, days)) { String[] split = time.split(":"); - // 将定时时间 根据系统设置 转换为 utc 对应时间 - String value = configService.getValue("timezone"); - TimeZone timezone = TimeZone.getTimeZone(value); - Calendar cal = Calendar.getInstance(); - int hourOfDay = Tool.NumberUtil.parseInt(split[0]); - int minute = Tool.NumberUtil.parseInt(split[1]); - cal.set(1997, 7, 1, hourOfDay, minute); - cal.add(Calendar.MILLISECOND, 0 - timezone.getRawOffset()); - hourOfDay = cal.get(Calendar.HOUR_OF_DAY); - minute = cal.get(Calendar.MINUTE); // 0 1 2 0 0 1,2,4 - return String.format("0 %s %s ? * %s *", minute, hourOfDay, days); + return String.format("0 %s %s ? * %s *", split[1], split[0], days); } return null; } diff --git a/nz-admin/src/main/java/com/nis/modules/alert/service/AlertRuleService.java b/nz-admin/src/main/java/com/nis/modules/alert/service/AlertRuleService.java index 0b8dfe3d..adfa29b9 100644 --- a/nz-admin/src/main/java/com/nis/modules/alert/service/AlertRuleService.java +++ b/nz-admin/src/main/java/com/nis/modules/alert/service/AlertRuleService.java @@ -37,5 +37,13 @@ public interface AlertRuleService extends IService<AlertRuleEntity> { AlertRuleEntity queryAlertRule(Integer id); + /** + * 任务是否在执行周期内 + * + * @param alertRule + * @return + */ + boolean isTaskInSched(AlertRuleEntity alertRule); + } diff --git a/nz-admin/src/main/java/com/nis/modules/alert/service/impl/AlertRuleServiceImpl.java b/nz-admin/src/main/java/com/nis/modules/alert/service/impl/AlertRuleServiceImpl.java index 5fc047b9..eb91b93d 100644 --- a/nz-admin/src/main/java/com/nis/modules/alert/service/impl/AlertRuleServiceImpl.java +++ b/nz-admin/src/main/java/com/nis/modules/alert/service/impl/AlertRuleServiceImpl.java @@ -11,6 +11,7 @@ import cn.hutool.json.JSONUtil; import cn.hutool.log.Log; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.nis.common.exception.NZException; @@ -45,6 +46,8 @@ import java.io.IOException; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.ZoneId; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -74,7 +77,7 @@ public class AlertRuleServiceImpl extends ServiceImpl<AlertRuleDao, AlertRuleEnt @Autowired private BasicImportAndExportServices basicImportAndExportServices; - + @Override public PageUtils queryPage(Map<String, Object> params) { String receiverStr = (String) params.get("receiver"); @@ -217,6 +220,9 @@ public class AlertRuleServiceImpl extends ServiceImpl<AlertRuleDao, AlertRuleEnt } this.updateById(alertRule); + + // 任务是否在执行周期内 + this.isTaskInSched(alertRule); } return alertRule.getId(); } @@ -500,6 +506,9 @@ public class AlertRuleServiceImpl extends ServiceImpl<AlertRuleDao, AlertRuleEnt rule.setId(oldRule.getId()); this.updateById(rule); + + // 任务是否在执行周期内 + this.isTaskInSched(rule); } else { params.put("save", true); // insert @@ -763,7 +772,7 @@ public class AlertRuleServiceImpl extends ServiceImpl<AlertRuleDao, AlertRuleEnt public AlertRuleEntity queryAlertRule(Integer id) { AlertRuleEntity alertRule = alertRuleDao.selectById(id); ValidateUtils.is(alertRule).notNull(RCode.ALERTRULE_NOT_EXIST); - + List<AlertMessageEntity> alertMessageList = alertMessageService.list(new LambdaQueryWrapper<AlertMessageEntity>().eq(AlertMessageEntity::getRuleId, id)); alertRule.setAlertNum(alertMessageList.size()); List<Map<String, Object>> alert = alertMessageService.getAlertsStatBySeverity("rule",id); @@ -796,4 +805,53 @@ public class AlertRuleServiceImpl extends ServiceImpl<AlertRuleDao, AlertRuleEnt alertRule.setStarred(CollUtil.isEmpty(tUserStatList) ? 0 : 1); return alertRule; } + + @Override + public boolean isTaskInSched(AlertRuleEntity rule) { + // 创建任务前,判断 rule 是否在执行周期内 + boolean isTaskInSched = false; + if (Tool.ObjectUtil.equal(1, rule.getSchedEnable())) { + List<String> schedDayList = Tool.StrUtil.split(rule.getSchedDays(), ","); + + String timezone = sysConfigService.getValue("timezone"); + // 当前时间-带时区 + LocalDateTime now = LocalDateTime.now(ZoneId.of(timezone)); + String currentWeek = Tool.StrUtil.toString((now.getDayOfWeek().getValue() % 7) + 1); + if (schedDayList.contains(currentWeek)) { + String schedStime = rule.getSchedStime(); + LocalDateTime startTime = LocalDateTime.now(ZoneId.of(timezone)); + startTime = startTime.withHour(Integer.valueOf(schedStime.split(":")[0])); + startTime = startTime.withMinute(Integer.valueOf(schedStime.split(":")[1])); + startTime = startTime.withSecond(0); + + String schedEtime = rule.getSchedEtime(); + LocalDateTime endTime = LocalDateTime.now(ZoneId.of(timezone)); + endTime = endTime.withHour(Integer.valueOf(schedEtime.split(":")[0])); + endTime = endTime.withMinute(Integer.valueOf(schedEtime.split(":")[1])); + endTime = endTime.withSecond(59); + + // 任务是否在执行周期内 + isTaskInSched = now.isAfter(startTime) && now.isBefore(endTime); + } + + // 在执行周期内,将 rule.state 设置为 0 + if (Tool.BooleanUtil.isTrue(isTaskInSched)) { + this.update(new UpdateWrapper<AlertRuleEntity>().lambda() + .set(AlertRuleEntity::getState, 1) + .eq(AlertRuleEntity::getId, rule.getId())); + } + + // 不在执行周期内,将 rule.state 设置为 0 + if (Tool.BooleanUtil.isFalse(isTaskInSched)) { + this.update(new UpdateWrapper<AlertRuleEntity>().lambda() + .set(AlertRuleEntity::getState, 0) + .eq(AlertRuleEntity::getId, rule.getId())); + } + } else { + isTaskInSched = false; + } + log.info("[isTaskInSched] [rule: {}] [schedEnable: {}] [inSched: {}]", rule.getId(), rule.getSchedEnable(), isTaskInSched); + return isTaskInSched; + } + } |
