From cb418ba35a6907dda710e9a3187d222c5131936e Mon Sep 17 00:00:00 2001 From: hanxuanyu <2252193204@qq.com> Date: Tue, 25 Jan 2022 16:33:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E9=80=9A=E7=9F=A5=E7=B1=BB=E5=9E=8B=E4=BB=A5=E5=8F=8A=E9=80=9A?= =?UTF-8?q?=E7=9F=A5bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- monitor-spring-boot-starter/pom.xml | 4 ++ .../hxuanyu/monitor/common/CheckResult.java | 37 +++++++++-- .../manager/MonitorItemBeanManager.java | 38 +++++++++--- .../com/hxuanyu/notify/enums/NotifyType.java | 3 +- .../hxuanyu/notify/service/NotifyService.java | 15 ++++- .../service/impl/NotifyServiceImpl.java | 9 +++ test/pom.xml | 5 -- .../controller/MonitorTestController.java | 61 +++++++++++++++++++ ...roller.java => NetworkTestController.java} | 26 +------- .../hxuanyu/test/monitor/TestMonitorItem.java | 30 ++++++++- .../starter/test/notify/NotifyTest.java | 4 ++ 11 files changed, 186 insertions(+), 46 deletions(-) create mode 100644 test/src/main/java/com/hxuanyu/test/controller/MonitorTestController.java rename test/src/main/java/com/hxuanyu/test/controller/{TestController.java => NetworkTestController.java} (60%) diff --git a/monitor-spring-boot-starter/pom.xml b/monitor-spring-boot-starter/pom.xml index a5de84d..64020b5 100644 --- a/monitor-spring-boot-starter/pom.xml +++ b/monitor-spring-boot-starter/pom.xml @@ -19,6 +19,10 @@ com.hxuanyu notify-spring-boot-starter + + com.hxuanyu + common-spring-boot-starter + \ No newline at end of file diff --git a/monitor-spring-boot-starter/src/main/java/com/hxuanyu/monitor/common/CheckResult.java b/monitor-spring-boot-starter/src/main/java/com/hxuanyu/monitor/common/CheckResult.java index e27a3b3..b9cf8fe 100644 --- a/monitor-spring-boot-starter/src/main/java/com/hxuanyu/monitor/common/CheckResult.java +++ b/monitor-spring-boot-starter/src/main/java/com/hxuanyu/monitor/common/CheckResult.java @@ -1,6 +1,7 @@ package com.hxuanyu.monitor.common; import com.hxuanyu.notify.enums.NotifyType; +import com.hxuanyu.notify.service.NotifyService; /** * 触发器通知 @@ -13,21 +14,33 @@ public class CheckResult { private boolean triggered; private Object notifyContent; private NotifyType notifyType; + private NotifyService.CustomNotify customNotify; public CheckResult() { } - public CheckResult(boolean triggered, Object notifyContent, NotifyType notifyType) { + private CheckResult(boolean triggered, Object notifyContent, NotifyType notifyType, NotifyService.CustomNotify customNotify) { this.triggered = triggered; this.notifyContent = notifyContent; this.notifyType = notifyType; + this.customNotify = customNotify; + } + + public NotifyService.CustomNotify getCustomNotify() { + return customNotify; + } + + public void setCustomNotify(NotifyService.CustomNotify customNotify) { + this.customNotify = customNotify; } @Override public String toString() { - return "Notify{" + + return "CheckResult{" + "triggered=" + triggered + - ", notifyContent='" + notifyContent + '\'' + + ", notifyContent=" + notifyContent + + ", notifyType=" + notifyType + + ", customNotify=" + customNotify + '}'; } @@ -37,18 +50,30 @@ public class CheckResult { * @return 通知对象 */ public static CheckResult nonTriggered() { - return new CheckResult(false, null, null); + return new CheckResult(false, null, null, null); } /** * 通知触发,需要传入通知信息 * * @param notifyContent 通知内容 - * @param notifyType 通知类型 + * @param notifyType 通知类型 * @return 返回结果 */ public static CheckResult triggered(Object notifyContent, NotifyType notifyType) { - return new CheckResult(true, notifyContent, notifyType); + return new CheckResult(true, notifyContent, notifyType, null); + } + + + + /** + * 自定义通知类型触发 + * + * @param customNotify 自定义通知 + * @return 返回结果 + */ + public static CheckResult triggered(NotifyService.CustomNotify customNotify) { + return new CheckResult(true, null, NotifyType.TYPE_CUSTOM, customNotify); } public boolean isTriggered() { diff --git a/monitor-spring-boot-starter/src/main/java/com/hxuanyu/monitor/manager/MonitorItemBeanManager.java b/monitor-spring-boot-starter/src/main/java/com/hxuanyu/monitor/manager/MonitorItemBeanManager.java index 4c8df53..ee0a36b 100644 --- a/monitor-spring-boot-starter/src/main/java/com/hxuanyu/monitor/manager/MonitorItemBeanManager.java +++ b/monitor-spring-boot-starter/src/main/java/com/hxuanyu/monitor/manager/MonitorItemBeanManager.java @@ -1,5 +1,6 @@ package com.hxuanyu.monitor.manager; +import com.hxuanyu.common.message.Msg; import com.hxuanyu.monitor.annotation.MonitorItem; import com.hxuanyu.monitor.base.BaseMonitorItem; import com.hxuanyu.monitor.common.CheckResult; @@ -58,31 +59,47 @@ public class MonitorItemBeanManager implements ApplicationListener msg = addMonitorTask(item); + logger.info("添加成功:{}", msg); } } } } } - public void addMonitorTask(BaseMonitorItem item) { + public Msg addMonitorTask(BaseMonitorItem item) { String taskId = "ScheduledTask-" + item.getMonitorItemName(); + if (MONITOR_ITEM_MAP.containsKey(taskId)) { + return Msg.failed("任务已经存在,请执行修改操作"); + } MONITOR_ITEM_MAP.put(taskId, item); logger.info("添加定时任务:{}, 执行周期:{}", taskId, item.getCron()); addTask(taskId, item); + return Msg.success("添加成功"); } - public void setMonitorTaskCron(String taskId, String cron) { + public Msg setMonitorTaskCron(String taskId, String cron) { if (MONITOR_ITEM_MAP.containsKey(taskId)) { + schedulingConfigurer.cancelTriggerTask(taskId); BaseMonitorItem item = MONITOR_ITEM_MAP.get(taskId); item.setCron(cron); addTask(taskId, item); + logger.info("修改定时任务:{}, 执行周期:{}", taskId, item.getCron()); + return Msg.success("修改成功"); + } else { + return Msg.failed("修改失败,该任务不存在"); } } - public void deleteMonitorTask(String taskId) { - MONITOR_ITEM_MAP.remove(taskId); - schedulingConfigurer.cancelTriggerTask(taskId); + public Msg deleteMonitorTask(String taskId) { + if (MONITOR_ITEM_MAP.containsKey(taskId)) { + MONITOR_ITEM_MAP.remove(taskId); + schedulingConfigurer.cancelTriggerTask(taskId); + logger.info("删除定时任务:{}", taskId); + return Msg.success("删除任务成功"); + } else { + return Msg.failed("任务不存在"); + } } private void addTask(String taskId, BaseMonitorItem item) { @@ -90,8 +107,13 @@ public class MonitorItemBeanManager implements ApplicationListener { CheckResult checkResult = item.check(); if (checkResult.isTriggered()) { - logger.info("定时任务[{}]触发成功,发送通知:[{}]", taskId, checkResult.getNotifyContent()); - notifyService.notify(checkResult.getNotifyContent(), NotifyType.TYPE_MAIL); + if (NotifyType.TYPE_CUSTOM.equals(checkResult.getNotifyType())){ + logger.info("定时任务[{}]触发成功,执行自定义通知", taskId); + notifyService.notify(checkResult.getCustomNotify()); + } else { + logger.info("定时任务[{}]触发成功,发送通知:[{}]", taskId, checkResult.getNotifyContent()); + notifyService.notify(checkResult.getNotifyContent(), checkResult.getNotifyType()); + } } }, new CronTrigger(cron))); } diff --git a/notify-spring-boot-starter/src/main/java/com/hxuanyu/notify/enums/NotifyType.java b/notify-spring-boot-starter/src/main/java/com/hxuanyu/notify/enums/NotifyType.java index f1463e5..b85e626 100644 --- a/notify-spring-boot-starter/src/main/java/com/hxuanyu/notify/enums/NotifyType.java +++ b/notify-spring-boot-starter/src/main/java/com/hxuanyu/notify/enums/NotifyType.java @@ -10,10 +10,11 @@ public enum NotifyType { /** - * 邮件类型 + * 通知类型 */ TYPE_LOG("日志输出"), TYPE_MAIL("邮件"), + TYPE_CUSTOM("自定义"), TYPE_MSG("短信"); private final String typeName; diff --git a/notify-spring-boot-starter/src/main/java/com/hxuanyu/notify/service/NotifyService.java b/notify-spring-boot-starter/src/main/java/com/hxuanyu/notify/service/NotifyService.java index 08727bb..84edeb2 100644 --- a/notify-spring-boot-starter/src/main/java/com/hxuanyu/notify/service/NotifyService.java +++ b/notify-spring-boot-starter/src/main/java/com/hxuanyu/notify/service/NotifyService.java @@ -1,7 +1,6 @@ package com.hxuanyu.notify.service; import com.hxuanyu.notify.enums.NotifyType; -import org.springframework.stereotype.Service; /** * 通知服务 @@ -17,4 +16,18 @@ public interface NotifyService { * @param notifyType 通知类型 */ void notify(Object content, NotifyType notifyType); + + /** + * 自定义通知 + * + * @param customNotify 自定义通知接口,需手动实现 + */ + void notify(CustomNotify customNotify); + + interface CustomNotify { + /** + * 通知 + */ + void onNotify(); + } } diff --git a/notify-spring-boot-starter/src/main/java/com/hxuanyu/notify/service/impl/NotifyServiceImpl.java b/notify-spring-boot-starter/src/main/java/com/hxuanyu/notify/service/impl/NotifyServiceImpl.java index f9be4d3..32ee412 100644 --- a/notify-spring-boot-starter/src/main/java/com/hxuanyu/notify/service/impl/NotifyServiceImpl.java +++ b/notify-spring-boot-starter/src/main/java/com/hxuanyu/notify/service/impl/NotifyServiceImpl.java @@ -25,17 +25,26 @@ public class NotifyServiceImpl implements NotifyService { @Override public void notify(Object content, NotifyType notifyType) { + logger.debug("通知内容:{},通知类型:{}", notifyType, notifyType); if (NotifyType.TYPE_MAIL.equals(notifyType)) { sendMail(content); } else if (NotifyType.TYPE_MSG.equals(notifyType)) { sendSms(content); } else if (NotifyType.TYPE_LOG.equals(notifyType)) { logger.info("新通知:{}", content); + } else if (NotifyType.TYPE_CUSTOM.equals(notifyType)) { + logger.warn("您选择了自定义通知,请实现CustomNotify接口并调用 notify(CustomNotify customNotify方法)"); } else { logger.info("未匹配到通知类型:[{}]", content); } } + @Override + public void notify(CustomNotify customNotify) { + logger.debug("执行自定义通知"); + customNotify.onNotify(); + } + private void sendSms(Object content) { logger.info("即将发送短信通知,通知内容:{}", content); } diff --git a/test/pom.xml b/test/pom.xml index d33fd78..5925f01 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -16,11 +16,6 @@ org.springframework.boot spring-boot-starter-web - - org.springframework.boot - spring-boot-starter-test - test - com.hxuanyu notify-spring-boot-starter diff --git a/test/src/main/java/com/hxuanyu/test/controller/MonitorTestController.java b/test/src/main/java/com/hxuanyu/test/controller/MonitorTestController.java new file mode 100644 index 0000000..7716fb7 --- /dev/null +++ b/test/src/main/java/com/hxuanyu/test/controller/MonitorTestController.java @@ -0,0 +1,61 @@ +package com.hxuanyu.test.controller; + +import com.hxuanyu.common.message.Msg; +import com.hxuanyu.monitor.base.BaseMonitorItem; +import com.hxuanyu.monitor.common.CheckResult; +import com.hxuanyu.monitor.manager.MonitorItemBeanManager; +import com.hxuanyu.notify.enums.NotifyType; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.Map; + +/** + * 监控项测试控制器 + * + * @author hanxuanyu + * @version 1.0 + */ + +@RequestMapping("/monitor") +@RestController +public class MonitorTestController { + + @Resource + MonitorItemBeanManager monitorItemBeanManager; + + @PutMapping("/") + public Msg setCron(String taskId, String taskCron) { + if (taskId == null || taskCron == null) { + return Msg.failed("参数不匹配"); + } + return monitorItemBeanManager.setMonitorTaskCron(taskId, taskCron); + } + + @DeleteMapping("/") + public Msg deleteTask(String taskId) { + if (taskId == null) { + return Msg.failed("taskId 未填写"); + } + return monitorItemBeanManager.deleteMonitorTask(taskId); + } + + @GetMapping("/") + public Msg> getTaskList() { + Map monitorItemMap = monitorItemBeanManager.getMonitorItemMap(); + return Msg.success("获取成功", monitorItemMap.values()); + } + + @PostMapping("/") + public Msg addTaskList() { + return monitorItemBeanManager.addMonitorTask(new BaseMonitorItem("CustomBean", "0/10 * * * * *") { + @Override + public CheckResult check() { + return CheckResult.triggered("动态新增通知", NotifyType.TYPE_LOG); + } + }); + } + + +} diff --git a/test/src/main/java/com/hxuanyu/test/controller/TestController.java b/test/src/main/java/com/hxuanyu/test/controller/NetworkTestController.java similarity index 60% rename from test/src/main/java/com/hxuanyu/test/controller/TestController.java rename to test/src/main/java/com/hxuanyu/test/controller/NetworkTestController.java index c21446e..83cc38e 100644 --- a/test/src/main/java/com/hxuanyu/test/controller/TestController.java +++ b/test/src/main/java/com/hxuanyu/test/controller/NetworkTestController.java @@ -1,12 +1,11 @@ package com.hxuanyu.test.controller; import com.hxuanyu.common.message.Msg; +import com.hxuanyu.monitor.manager.MonitorItemBeanManager; import com.hxuanyu.notify.model.Mail; import com.hxuanyu.notify.service.MailService; -import com.hxuanyu.notify.service.NotifyService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -19,28 +18,9 @@ import javax.annotation.Resource; */ @RestController -public class TestController { - - private final Logger logger = LoggerFactory.getLogger(TestController.class); - @Resource - MailService mailService; - - @RequestMapping("/testMail") - public Msg testMail() { - Mail mail = new Mail(); - mail.setContent("邮件内容"); - mail.setSubject("邮件主题"); - mail.setTo("2252193204@qq.com"); - - try { - mailService.sendMail(mail); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - return Msg.success("发送邮件成功", mail); - } +public class NetworkTestController { + private final Logger logger = LoggerFactory.getLogger(NetworkTestController.class); @ResponseBody @GetMapping("/") diff --git a/test/src/main/java/com/hxuanyu/test/monitor/TestMonitorItem.java b/test/src/main/java/com/hxuanyu/test/monitor/TestMonitorItem.java index 94a9aed..cdc95ba 100644 --- a/test/src/main/java/com/hxuanyu/test/monitor/TestMonitorItem.java +++ b/test/src/main/java/com/hxuanyu/test/monitor/TestMonitorItem.java @@ -4,17 +4,43 @@ import com.hxuanyu.monitor.annotation.MonitorItem; import com.hxuanyu.monitor.base.BaseMonitorItem; import com.hxuanyu.monitor.common.CheckResult; import com.hxuanyu.notify.enums.NotifyType; +import com.hxuanyu.notify.model.Mail; +import com.hxuanyu.notify.service.NotifyService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * 定时任务监控测试 * * @author hxuanyu */ -@MonitorItem(cron = "0/5 * * * * *") +@MonitorItem(cron = "0/20 * * * * *") public class TestMonitorItem extends BaseMonitorItem { + private final Logger logger = LoggerFactory.getLogger(TestMonitorItem.class); + @Override public CheckResult check() { - return CheckResult.triggered("Hello", NotifyType.TYPE_LOG); + + double random = Math.random(); + int result = (int) (random * NotifyType.values().length); + logger.info("随机索引值:{}", result); + if (NotifyType.values().length > 0) { + NotifyType notifyType = NotifyType.values()[result]; + switch (notifyType) { + case TYPE_LOG: + return CheckResult.triggered("日志输出", NotifyType.TYPE_LOG); + case TYPE_CUSTOM: + return CheckResult.triggered(() -> logger.info("自定义通知")); + case TYPE_MAIL: + return CheckResult.triggered(new Mail("2252193204@qq.com", "测试邮件主题", "测试邮件内容"), NotifyType.TYPE_MAIL); + case TYPE_MSG: + return CheckResult.triggered("短信通知", NotifyType.TYPE_MSG); + default: + return CheckResult.triggered("默认通知", null); + } + } + + return CheckResult.nonTriggered(); } } diff --git a/test/src/test/java/com/hxuanyu/starter/test/notify/NotifyTest.java b/test/src/test/java/com/hxuanyu/starter/test/notify/NotifyTest.java index a166673..7b5cae6 100644 --- a/test/src/test/java/com/hxuanyu/starter/test/notify/NotifyTest.java +++ b/test/src/test/java/com/hxuanyu/starter/test/notify/NotifyTest.java @@ -22,6 +22,10 @@ public class NotifyTest { sleep(2000); notifyService.notify("短信通知方式", NotifyType.TYPE_MSG); notifyService.notify("日志输出方式", NotifyType.TYPE_LOG); + notifyService.notify(() -> { + // do some things + + }); } }