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
+
+ });
}
}