Explorar o código

监控任务的开发

reghao %!s(int64=4) %!d(string=hai) anos
pai
achega
1c5dca1dc0

+ 6 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/orm/CrudOps.java

@@ -18,6 +18,12 @@ public interface CrudOps<T> {
     default T select(Integer id) {
         return null;
     }
+    default T selectByPk(String pk) {
+        return null;
+    }
+    default T selectByUk(String uk) {
+        return null;
+    }
     default T selectByUniqueKey(String uniqueKey) {
         return null;
     }

+ 35 - 25
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/controller/MonitorController.java

@@ -1,27 +1,22 @@
 package cn.reghao.autodop.dmaster.monitor.controller;
 
-import cn.reghao.autodop.common.result.Result;
-import cn.reghao.autodop.common.result.ResultStatus;
 import cn.reghao.autodop.dmaster.monitor.entity.AppMonitor;
 import cn.reghao.autodop.dmaster.monitor.entity.MachineMonitor;
 import cn.reghao.autodop.dmaster.monitor.entity.MonitorJob;
 import cn.reghao.autodop.dmaster.monitor.entity.MonitorType;
 import cn.reghao.autodop.dmaster.monitor.repository.AppMonitorRepository;
 import cn.reghao.autodop.dmaster.monitor.repository.MachineMonitorRepository;
-import cn.reghao.autodop.dmaster.monitor.service.MonitorScheduler;
 import cn.reghao.autodop.dmaster.monitor.service.MonitorService;
 import cn.reghao.autodop.dmaster.notification.entity.NotifyGroup;
 import cn.reghao.autodop.dmaster.utils.WebBody;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
-import org.quartz.SchedulerException;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
-import java.io.IOException;
 import java.util.List;
 
 /**
@@ -35,63 +30,74 @@ import java.util.List;
 public class MonitorController {
     private MonitorService<MachineMonitor> machineMonitorService;
     private MonitorService<AppMonitor> appMonitorService;
-
-    private MonitorScheduler monitorScheduler;
     private MachineMonitorRepository machineMonitorRepository;
     private AppMonitorRepository appMonitorRepository;
 
     public MonitorController(MonitorService<MachineMonitor> machineMonitorService,
                              MonitorService<AppMonitor> appMonitorService,
-                             MonitorScheduler monitorScheduler,
                              MachineMonitorRepository machineMonitorRepository,
                              AppMonitorRepository appMonitorRepository) {
         this.machineMonitorService = machineMonitorService;
         this.appMonitorService = appMonitorService;
-        this.monitorScheduler = monitorScheduler;
         this.machineMonitorRepository = machineMonitorRepository;
         this.appMonitorRepository = appMonitorRepository;
     }
 
-    // TODO 任务启用或禁用时设置都立即生效
     @ApiOperation(value = "设置机器监控通知")
     @PostMapping(value = "/{monitorType}/notify/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
     @ResponseBody
     public ResponseEntity<String> machineMonitorNotify(@PathVariable("monitorType") String monitorType,
                                                        @PathVariable("id") Integer id,
                                                        @RequestParam("groupId") List<NotifyGroup> notifyGroups) {
-
         switch (MonitorType.valueOf(monitorType)) {
             case machine:
                 MachineMonitor machineMonitor = machineMonitorRepository.findById(id).orElse(null);
-                notifyGroups.forEach(notifyGroup ->
-                        machineMonitorService.setMonitorNotify(machineMonitor, notifyGroup));
+                notifyGroups.forEach(notifyGroup -> machineMonitorService.setNotify(machineMonitor, notifyGroup));
                 break;
             case app:
                 AppMonitor appMonitor = appMonitorRepository.findById(id).orElse(null);
-                notifyGroups.forEach(notifyGroup -> appMonitorService.setMonitorNotify(appMonitor, notifyGroup));
+                notifyGroups.forEach(notifyGroup -> appMonitorService.setNotify(appMonitor, notifyGroup));
                 break;
             default:
         }
         return ResponseEntity.ok().body(WebBody.success());
     }
 
-    @ApiOperation(value = "设置机器监控任务")
+    @ApiOperation(value = "添加/编辑机器监控任务")
     @PostMapping(value = "/{monitorType}/job/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
     public ResponseEntity<String> machineMonitorJob(@PathVariable("monitorType") String monitorType,
                                                     @PathVariable("id") Integer id,
-                                                    @Valid MonitorJob monitorJob) throws SchedulerException, IOException {
+                                                    @Valid MonitorJob monitorJob) {
         switch (MonitorType.valueOf(monitorType)) {
             case machine:
                 MachineMonitor machineMonitor = machineMonitorRepository.findById(id).orElse(null);
-                machineMonitorService.addMonitorJob(machineMonitor, monitorJob);
+                machineMonitorService.addJob(machineMonitor, monitorJob);
                 break;
             case app:
                 AppMonitor appMonitor = appMonitorRepository.findById(id).orElse(null);
-                appMonitorService.addMonitorJob(appMonitor, monitorJob);
+                appMonitorService.addJob(appMonitor, monitorJob);
                 break;
             default:
         }
+        return ResponseEntity.ok().body(WebBody.success());
+    }
 
+    @ApiOperation(value = "删除机器监控任务")
+    @DeleteMapping(value = "/{monitorType}/job/{id}/{jobId}", produces = MediaType.APPLICATION_JSON_VALUE)
+    public ResponseEntity<String> deleteMachineMonitorJob(@PathVariable("monitorType") String monitorType,
+                                                          @PathVariable("id") Integer id,
+                                                          @PathVariable("jobId") String jobId) {
+        switch (MonitorType.valueOf(monitorType)) {
+            case machine:
+                MachineMonitor machineMonitor = machineMonitorRepository.findById(id).orElse(null);
+                machineMonitorService.deleteJob(machineMonitor, jobId);
+                break;
+            case app:
+                AppMonitor appMonitor = appMonitorRepository.findById(id).orElse(null);
+                appMonitorService.deleteJob(appMonitor, jobId);
+                break;
+            default:
+        }
         return ResponseEntity.ok().body(WebBody.success());
     }
 
@@ -100,22 +106,26 @@ public class MonitorController {
     public ResponseEntity<String> machineJobStatus(@PathVariable("monitorType") String monitorType,
                                                    @PathVariable("id") Integer id,
                                                    @PathVariable("jobId") String jobId,
-                                                   @PathVariable("enable") Boolean enable) throws SchedulerException {
-        Result result;
+                                                   @PathVariable("enable") Boolean enable) {
         switch (MonitorType.valueOf(monitorType)) {
             case machine:
                 MachineMonitor machineMonitor = machineMonitorRepository.findById(id).orElse(null);
-                machineMonitorService.startOrPause(machineMonitor, jobId, enable);
+                if (enable) {
+                    machineMonitorService.startJob(machineMonitor, jobId);
+                } else {
+                    machineMonitorService.pauseJob(machineMonitor, jobId);
+                }
                 break;
             case app:
                 AppMonitor appMonitor = appMonitorRepository.findById(id).orElse(null);
-                appMonitorService.startOrPause(appMonitor, jobId, enable);
-                appMonitorRepository.save(appMonitor);
+                if (enable) {
+                    appMonitorService.startJob(appMonitor, jobId);
+                } else {
+                    appMonitorService.pauseJob(appMonitor, jobId);
+                }
                 break;
             default:
-
         }
-
         return ResponseEntity.ok().body(WebBody.success());
     }
 }

+ 5 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/controller/MonitorPageController.java

@@ -109,15 +109,16 @@ public class MonitorPageController {
     public String monitorAddPage(@PathVariable("monitorType") String monitorType,
                                  @PathVariable("id") Integer id,
                                  Model model) {
-
         String addJobUrl;
         String editJobUrl;
+        String jobDeleteApi;
         String jobStatusApi;
         List<MonitorJob> list;
         switch (MonitorType.valueOf(monitorType)) {
             case machine:
                 addJobUrl = String.format("/monitor/machine/jobs/add/%s", id);
                 editJobUrl = String.format("/monitor/machine/jobs/edit/%s", id);
+                jobDeleteApi = String.format("/api/monitor/machine/job/%s", id);
                 jobStatusApi = String.format("/api/monitor/machine/job/%s", id);
                 MachineMonitor machineMonitor = machineMonitorRepository.findById(id).orElse(null);
                 list = new ArrayList<>(machineMonitor.getJobMap().values());
@@ -125,6 +126,7 @@ public class MonitorPageController {
             case app:
                 addJobUrl = String.format("/monitor/app/jobs/add/%s", id);
                 editJobUrl = String.format("/monitor/app/jobs/edit/%s", id);
+                jobDeleteApi = String.format("/api/monitor/app/job/%s", id);
                 jobStatusApi = String.format("/api/monitor/app/job/%s", id);
                 AppMonitor appMonitor = appMonitorRepository.findById(id).orElse(null);
                 list = new ArrayList<>(appMonitor.getJobMap().values());
@@ -132,12 +134,14 @@ public class MonitorPageController {
             default:
                 addJobUrl = null;
                 editJobUrl = null;
+                jobDeleteApi = null;
                 jobStatusApi = null;
                 list = Collections.emptyList();
         }
 
         model.addAttribute("addJobUrl", addJobUrl);
         model.addAttribute("editJobUrl", editJobUrl);
+        model.addAttribute("jobDeleteApi", jobDeleteApi);
         model.addAttribute("jobStatusApi", jobStatusApi);
         model.addAttribute("list", list);
         return "/monitor/monitorjobs";
@@ -148,7 +152,6 @@ public class MonitorPageController {
     public String monitorJobAddPage(@PathVariable("monitorType") String monitorType,
                                     @PathVariable("id") Integer id,
                                     Model model) throws IOException {
-
         String addJobApi;
         String jobPkg;
         Set<String> exclude;

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/entity/AppMonitor.java

@@ -16,6 +16,7 @@ import javax.persistence.*;
 @Data
 @Entity
 public class AppMonitor extends BaseMonitor {
+    // TODO 与 AppRunning 关联
     private String appId;
     private String appName;
     private String machineId;

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/entity/BaseMonitor.java

@@ -24,6 +24,7 @@ public class BaseMonitor extends BaseEntity<Integer> {
 
     @ElementCollection(targetClass = MonitorJob.class)
     @MapKeyClass(String.class)
+    @LazyCollection(LazyCollectionOption.FALSE)
     private Map<String, MonitorJob> jobMap;
 
     @ManyToMany(cascade = CascadeType.REFRESH)

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/entity/MachineMonitor.java

@@ -6,7 +6,6 @@ import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 
 import javax.persistence.*;
-import java.util.Map;
 
 /**
  * @author reghao
@@ -17,6 +16,7 @@ import java.util.Map;
 @Data
 @Entity
 public class MachineMonitor extends BaseMonitor {
+    // TODO 与 MachineInfo 关联
     private String machineId;
     private String machineIpv4;
 

+ 8 - 14
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/AppMonitorServiceImpl.java

@@ -26,30 +26,24 @@ public class AppMonitorServiceImpl implements MonitorService<AppMonitor> {
     }
 
     @Override
-    public void setMonitorNotify(AppMonitor monitor, NotifyGroup notifyGroup) {
+    public void setNotify(AppMonitor monitor, NotifyGroup notifyGroup) {
         monitor.getNotifyGroups().add(notifyGroup);
         appMonitorRepository.save(monitor);
     }
 
     @Override
-    public void addMonitorJob(AppMonitor monitor, MonitorJob monitorJob) throws IOException, SchedulerException {
-        String jobId1 = String.format("%s-%s-%s",
-                monitor.getAppId(), monitor.getMachineId(), monitorJob.getJobClassName());
-        monitorJob.setJobId(jobId1);
-        monitorJob.setEnable(true);
-
-        Map<String, MonitorJob> monitorJobs1 = monitor.getJobMap();
-        monitorJobs1.put(monitorJob.getJobId(), monitorJob);
-        // TODO 这两个操作应该在一个事务中
-        monitorScheduler.addAppMonitorJob(monitor, jobId1);
-        appMonitorRepository.save(monitor);
+    public void addJob(AppMonitor monitor, MonitorJob monitorJob) {
+    }
+
+    @Override
+    public void deleteJob(AppMonitor monitor, String jobId) {
     }
 
     @Override
-    public void deleteMonitorJob(AppMonitor monitor, String jobId) {
+    public void startJob(AppMonitor monitor, String jobId) {
     }
 
     @Override
-    public void startOrPause(AppMonitor monitor, String jobId, Boolean enable) {
+    public void pauseJob(AppMonitor monitor, String jobId) {
     }
 }

+ 64 - 22
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/MachineMonitorServiceImpl.java

@@ -4,6 +4,7 @@ import cn.reghao.autodop.dmaster.monitor.entity.MachineMonitor;
 import cn.reghao.autodop.dmaster.monitor.entity.MonitorJob;
 import cn.reghao.autodop.dmaster.monitor.repository.MachineMonitorRepository;
 import cn.reghao.autodop.dmaster.notification.entity.NotifyGroup;
+import lombok.extern.slf4j.Slf4j;
 import org.quartz.SchedulerException;
 import org.springframework.stereotype.Service;
 
@@ -14,6 +15,7 @@ import java.util.Map;
  * @author reghao
  * @date 2020-10-22 17:51:56
  */
+@Slf4j
 @Service
 public class MachineMonitorServiceImpl implements MonitorService<MachineMonitor> {
     private MonitorScheduler monitorScheduler;
@@ -26,51 +28,91 @@ public class MachineMonitorServiceImpl implements MonitorService<MachineMonitor>
     }
 
     @Override
-    public void setMonitorNotify(MachineMonitor monitor, NotifyGroup notifyGroup) {
+    public void setNotify(MachineMonitor monitor, NotifyGroup notifyGroup) {
         monitor.getNotifyGroups().add(notifyGroup);
         machineMonitorRepository.save(monitor);
     }
 
     @Override
-    public void addMonitorJob(MachineMonitor monitor, MonitorJob monitorJob) throws IOException, SchedulerException {
+    public synchronized void addJob(MachineMonitor monitor, MonitorJob monitorJob) {
         String jobId = String.format("%s-%s", monitor.getMachineId(), monitorJob.getJobClassName());
         monitorJob.setJobId(jobId);
         monitorJob.setEnable(true);
+        monitor.getJobMap().put(monitorJob.getJobId(), monitorJob);
 
-        Map<String, MonitorJob> monitorJobs = monitor.getJobMap();
-        monitorJobs.put(monitorJob.getJobId(), monitorJob);
-        // TODO 这两个操作应该在一个事务中
-        monitorScheduler.addMachineMonitorJob(monitor, jobId);
-        machineMonitorRepository.save(monitor);
+        int runningJobs = monitor.getRunningJobs();
+        monitor.setRunningJobs(runningJobs+1);
+        int totalJobs = monitor.getTotalJobs();
+        monitor.setTotalJobs(totalJobs+1);
+
+        // TODO 这两个操作的状态应该保持一致
+        try {
+            monitorScheduler.addMachineMonitorJob(monitor, jobId);
+            machineMonitorRepository.save(monitor);
+        } catch (SchedulerException | IOException e) {
+            log.error("{}", e.getMessage());
+        }
     }
 
     @Override
-    public void deleteMonitorJob(MachineMonitor monitor, String jobId) {
+    public synchronized void deleteJob(MachineMonitor monitor, String jobId) {
+        Map<String, MonitorJob> map = monitor.getJobMap();
+        MonitorJob monitorJob = map.get(jobId);
+        map.remove(jobId);
+        if (monitorJob.getEnable()) {
+            int runningJobs = monitor.getRunningJobs();
+            monitor.setRunningJobs(runningJobs-1);
+        }
+        int totalJobs = monitor.getTotalJobs();
+        monitor.setTotalJobs(totalJobs-1);
+
+        try {
+            monitorScheduler.delete(jobId);
+            machineMonitorRepository.save(monitor);
+        } catch (SchedulerException e) {
+            log.error("{}", e.getMessage());
+        }
     }
 
     @Override
-    public void startOrPause(MachineMonitor monitor, String jobId, Boolean enable) throws SchedulerException {
+    public synchronized void startJob(MachineMonitor monitor, String jobId) {
         MonitorJob monitorJob = monitor.getJobMap().get(jobId);
         boolean isEnable = monitorJob.getEnable();
-        if (enable && !isEnable) {
-            // 开启任务
-            monitorScheduler.resume(monitorJob.getJobId());
+        if (!isEnable) {
             monitorJob.setEnable(true);
-            // TODO 应该是一个原子操作
             int runningJobs = monitor.getRunningJobs();
-            runningJobs++;
-            monitor.setRunningJobs(runningJobs);
+            monitor.setRunningJobs(runningJobs+1);
+
+            try {
+                boolean isExist = monitorScheduler.isJobExist(jobId);
+                if (isExist) {
+                    monitorScheduler.resume(monitorJob.getJobId());
+                } else {
+                    monitorScheduler.addMachineMonitorJob(monitor, jobId);
+                }
+                machineMonitorRepository.save(monitor);
+            } catch (SchedulerException | IOException e) {
+                e.printStackTrace();
+            }
         }
+    }
 
-        if (!enable && isEnable) {
-            // 停止任务
-            monitorScheduler.pause(monitorJob.getJobId());
+    @Override
+    public synchronized void pauseJob(MachineMonitor monitor, String jobId) {
+        MonitorJob monitorJob = monitor.getJobMap().get(jobId);
+        boolean isEnable = monitorJob.getEnable();
+        if (isEnable) {
             monitorJob.setEnable(false);
-            // TODO 应该是一个原子操作
             int runningJobs = monitor.getRunningJobs();
-            runningJobs--;
-            monitor.setRunningJobs(runningJobs);
+            monitor.setRunningJobs(runningJobs-1);
+
+            try {
+                monitorScheduler.pause(monitorJob.getJobId());
+                machineMonitorRepository.save(monitor);
+            } catch (SchedulerException e) {
+                log.error("{}", e.getMessage());
+            }
+
         }
-        machineMonitorRepository.save(monitor);
     }
 }

+ 61 - 6
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/MonitorScheduler.java

@@ -60,16 +60,23 @@ public class MonitorScheduler {
      * @date 2021-06-24 上午10:22
      */
     @PostConstruct
-    public void startScheduler() throws SchedulerException {
+    public void startScheduler() throws SchedulerException, IOException {
         List<MachineMonitor> machineMonitors = machineMonitorRepository.findAll();
         for (MachineMonitor machineMonitor : machineMonitors) {
-
-            //addMachineHeartbeatCheckJob(machineMonitor);
+            for (MonitorJob monitorJob : machineMonitor.getJobMap().values()) {
+                if (monitorJob.getEnable()) {
+                    addMachineMonitorJob(machineMonitor, monitorJob);
+                }
+            }
         }
 
         List<AppMonitor> appMonitors = appMonitorRepository.findAll();
         for (AppMonitor appMonitor : appMonitors) {
-            //addAppHealthCheckJob(appMonitor);
+            for (MonitorJob monitorJob : appMonitor.getJobMap().values()) {
+                if (monitorJob.getEnable()) {
+                    addAppMonitorJob(appMonitor, monitorJob);
+                }
+            }
         }
         // TODO 系统启动时启用所有存在的任务
         scheduler.start();
@@ -96,6 +103,20 @@ public class MonitorScheduler {
         addAndStart(jobClass, jobId, cronExp, jobDataMap);
     }
 
+    private void addMachineMonitorJob(MachineMonitor machineMonitor, MonitorJob monitorJob)
+            throws SchedulerException, IOException {
+        List<NotifyGroup> notifyGroups = machineMonitor.getNotifyGroups();
+        String cronExp = monitorJob.getCronExp();
+        Class jobClass = findClassBySimpleName(monitorJob.getJobClassName());
+
+        JobDataMap jobDataMap = new JobDataMap();
+        jobDataMap.put("notifyService", notifyService);
+        jobDataMap.put("notifyGroups", notifyGroups);
+        jobDataMap.put("machineId", machineMonitor.getMachineId());
+        jobDataMap.put("statusCrudService", statusCrudService);
+        addAndStart(jobClass, monitorJob.getJobId(), cronExp, jobDataMap);
+    }
+
     public void addAppMonitorJob(AppMonitor appMonitor, String jobId) throws SchedulerException, IOException {
         MonitorJob monitorJob = appMonitor.getJobMap().get(jobId);
         List<NotifyGroup> notifyGroups = appMonitor.getNotifyGroups();
@@ -112,6 +133,21 @@ public class MonitorScheduler {
         addAndStart(jobClass, jobId, cronExp, jobDataMap);
     }
 
+    private void addAppMonitorJob(AppMonitor appMonitor, MonitorJob monitorJob) throws SchedulerException, IOException {
+        List<NotifyGroup> notifyGroups = appMonitor.getNotifyGroups();
+        String cronExp = monitorJob.getCronExp();
+        Class jobClass = findClassBySimpleName(monitorJob.getJobClassName());
+
+        JobDataMap jobDataMap = new JobDataMap();
+        jobDataMap.put("notifyService", notifyService);
+        jobDataMap.put("notifyGroups", notifyGroups);
+        jobDataMap.put("webRequest", webRequest);
+        jobDataMap.put("appId", appMonitor.getAppId());
+        jobDataMap.put("machineId", appMonitor.getMachineId());
+        jobDataMap.put("runningRepository", runningRepository);
+        addAndStart(jobClass, monitorJob.getJobId(), cronExp, jobDataMap);
+    }
+
     private void addAndStart(Class<? extends Job> clazz, String jobId, String cronExp, JobDataMap jobDataMap)
             throws SchedulerException {
         JobDetail jobDetail = JobBuilder.newJob(clazz)
@@ -121,20 +157,39 @@ public class MonitorScheduler {
                 .build();
 
         CronTrigger cronTrigger = TriggerBuilder.newTrigger()
-                .withIdentity(jobId + "@trigger")
+                .withIdentity(jobId)
                 .withSchedule(CronScheduleBuilder.cronSchedule(cronExp))
                 .build();
 
-        if (scheduler.getJobDetail(jobDetail.getKey()) == null) {
+        if (!isJobExist(jobId)) {
             scheduler.scheduleJob(jobDetail, cronTrigger);
             log.info("添加新定时任务 {}...", jobId);
         }
     }
 
+    public void updateCronExp(String jobId, String cronExp) throws SchedulerException {
+        //scheduler.rescheduleJob()
+        Trigger trigger = scheduler.getTrigger(TriggerKey.triggerKey(jobId));
+        JobDetail jobDetail = scheduler.getJobDetail(JobKey.jobKey(jobId));
+        JobDataMap jobDataMap = jobDetail.getJobDataMap();
+    }
+
+    public void updateNotifyGroup(String jobId, List<NotifyGroup> notifyGroups) {
+
+    }
+
+    public void delete(String jobId) throws SchedulerException {
+        scheduler.deleteJob(JobKey.jobKey(jobId));
+    }
+
     public void pause(String jobId) throws SchedulerException {
         scheduler.pauseJob(JobKey.jobKey(jobId));
     }
 
+    public boolean isJobExist(String jobId) throws SchedulerException {
+        return scheduler.checkExists(JobKey.jobKey(jobId));
+    }
+
     public void resume(String jobId) throws SchedulerException {
         scheduler.resumeJob(JobKey.jobKey(jobId));
     }

+ 7 - 7
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/MonitorService.java

@@ -2,17 +2,17 @@ package cn.reghao.autodop.dmaster.monitor.service;
 
 import cn.reghao.autodop.dmaster.monitor.entity.MonitorJob;
 import cn.reghao.autodop.dmaster.notification.entity.NotifyGroup;
-import org.quartz.SchedulerException;
-
-import java.io.IOException;
 
 /**
+ * 监控任务接口
+ *
  * @author reghao
  * @date 2020-10-22 17:51:56
  */
 public interface MonitorService<T> {
-    void setMonitorNotify(T monitor, NotifyGroup notifyGroup);
-    void addMonitorJob(T monitor, MonitorJob monitorJob) throws IOException, SchedulerException;
-    void deleteMonitorJob(T monitor, String jobId);
-    void startOrPause(T monitor, String jobId, Boolean enable) throws SchedulerException;
+    void setNotify(T monitor, NotifyGroup notifyGroup);
+    void addJob(T monitor, MonitorJob monitorJob);
+    void deleteJob(T monitor, String jobId);
+    void startJob(T monitor, String jobId);
+    void pauseJob(T monitor, String jobId);
 }

+ 3 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/job/machine/MachineDiskUsageCheckJob.java

@@ -32,8 +32,9 @@ public class MachineDiskUsageCheckJob implements Job {
         List<NotifyGroup> notifyGroups = (List<NotifyGroup>) jobDataMap.get("notifyGroups");
         MachineStatusCrudService statusCrudService = (MachineStatusCrudService) jobDataMap.get("statusCrudService");
         String machineId = jobDataMap.getString("machineId");
+        log.info("检查 {} 的磁盘使用情况...", machineId);
 
-        MachineStatus machineStatus = statusCrudService.selectByUniqueKey(machineId);
+        /*MachineStatus machineStatus = statusCrudService.selectByUniqueKey(machineId);
         long lastCheck = DateTimeConverter.msTimestamp(machineStatus.getLastCheck());
         long now = System.currentTimeMillis();
         machineStatus.setLastCheck(LocalDateTime.now());
@@ -46,6 +47,6 @@ public class MachineDiskUsageCheckJob implements Job {
             String msg = String.format("距离上次接收到 %s 的心跳消息已过去 %ss", machineStatus.getMachineIpv4(), result/1000);
             DingMsg dingMsg = new DingMsg("监控报警",msg);
             notifyGroups.forEach(notifyGroup -> notifyService.notify(notifyGroup, dingMsg));
-        }
+        }*/
     }
 }

+ 3 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/job/machine/MachineHeartbeatCheckJob.java

@@ -32,8 +32,9 @@ public class MachineHeartbeatCheckJob implements Job {
         List<NotifyGroup> notifyGroups = (List<NotifyGroup>) jobDataMap.get("notifyGroups");
         MachineStatusCrudService statusCrudService = (MachineStatusCrudService) jobDataMap.get("statusCrudService");
         String machineId = jobDataMap.getString("machineId");
+        log.info("检查 {} 的上次心跳时间...", machineId);
 
-        MachineStatus machineStatus = statusCrudService.selectByUniqueKey(machineId);
+        /*MachineStatus machineStatus = statusCrudService.selectByUniqueKey(machineId);
         long lastCheck = DateTimeConverter.msTimestamp(machineStatus.getLastCheck());
         long now = System.currentTimeMillis();
         machineStatus.setLastCheck(LocalDateTime.now());
@@ -46,6 +47,6 @@ public class MachineHeartbeatCheckJob implements Job {
             String msg = String.format("距离上次接收到 %s 的心跳消息已过去 %ss", machineStatus.getMachineIpv4(), result/1000);
             DingMsg dingMsg = new DingMsg("监控报警",msg);
             notifyGroups.forEach(notifyGroup -> notifyService.notify(notifyGroup, dingMsg));
-        }
+        }*/
     }
 }

+ 2 - 0
dmaster/src/main/resources/templates/monitor/monitorjobs.html

@@ -36,6 +36,8 @@
                         <a class="open-popup" data-title="编辑任务"
                            th:attr="data-url=@{${editJobUrl}+'/'+${item.jobId}}"
                            data-size="640,480" href="#">编辑</a>
+                        <a class="ajax-delete" th:attr="data-msg='确定要删除 '+ ${item.jobId} + '?'"
+                           th:href="@{${jobDeleteApi}+'/' + ${item.jobId}}">删除</a>
                         <a class="ajax-post"
                            th:href="@{${jobStatusApi}+'/'+${item.jobId}+'/1'}">启用</a>
                         <a class="ajax-post"