diff --git a/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java new file mode 100644 index 0000000..c9068b7 --- /dev/null +++ b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface StatusEnum { + //任务开启 + String STATUS_OPEN = "1"; + //任务关闭 + String STATUS_CLOSE = "0"; + + +} diff --git a/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java new file mode 100644 index 0000000..c9068b7 --- /dev/null +++ b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface StatusEnum { + //任务开启 + String STATUS_OPEN = "1"; + //任务关闭 + String STATUS_CLOSE = "0"; + + +} diff --git a/casic-data/pom.xml b/casic-data/pom.xml index 7b9d140..aca0a62 100644 --- a/casic-data/pom.xml +++ b/casic-data/pom.xml @@ -52,6 +52,13 @@ 2.0.0 compile + + com.casic + casic-quartz + 2.0.0 + compile + + diff --git a/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java new file mode 100644 index 0000000..c9068b7 --- /dev/null +++ b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface StatusEnum { + //任务开启 + String STATUS_OPEN = "1"; + //任务关闭 + String STATUS_CLOSE = "0"; + + +} diff --git a/casic-data/pom.xml b/casic-data/pom.xml index 7b9d140..aca0a62 100644 --- a/casic-data/pom.xml +++ b/casic-data/pom.xml @@ -52,6 +52,13 @@ 2.0.0 compile + + com.casic + casic-quartz + 2.0.0 + compile + + diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java index 78b93e8..cbb235e 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java @@ -1,105 +1,106 @@ -//package com.casic.missiles.modular.system.controller; -// -//import com.casic.missiles.core.base.controller.ExportController; -//import com.stylefeng.guns.core.result.ResultData; -//import org.springframework.stereotype.Controller; -//import org.springframework.web.bind.annotation.RequestMapping; -//import org.springframework.web.bind.annotation.ResponseBody; -//import org.springframework.web.bind.annotation.PathVariable; -//import org.springframework.beans.factory.annotation.Autowired; -//import com.casic.missiles.core.page.PageFactory; -//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -//import java.util.List; -//import com.stylefeng.guns.core.common.constant.factory.PageFactory; -//import org.springframework.web.bind.annotation.RequestParam; -//import com.stylefeng.guns.modular.system.model.BusPlan; -//import com.stylefeng.guns.modular.system.service.IBusPlanService; -// -///** -// * 任务计划控制器 -// * -// * @author dev -// * @Date 2023-04-18 15:44:40 -// */ -//@Controller -//@RequestMapping("/busPlan") -//public class BusPlanController extends ExportController { -// -// -// @Autowired -// private IBusPlanService busPlanService; -// -// +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.model.BusPlan; +import com.casic.missiles.modular.system.service.IBusPlanService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.validation.Valid; +import java.util.Objects; + +/** + * 任务计划控制器 + * + * @author dev + * @Date 2023-04-18 15:44:40 + */ +@Controller +@RequestMapping("/task") +public class BusPlanController extends ExportController { + + + @Autowired + private IBusPlanService busPlanService; + + + /** + * 获取任务计划列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String condition) { + return busPlanService.list(null); + } + + /** + * 获取任务计划分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = new QueryWrapper<>(); + page = busPlanService.page(page, query); + return super.packForBT(page); + } + + /** + * 新增任务计划 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusPlan busPlan) { + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("新增失败"); + + } + + /** + * 删除任务计划 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); + } + // /** -// * 获取任务计划列表 -// */ -// @RequestMapping(value = "/list") -// @ResponseBody -// public Object list(String condition) { -// return busPlanService.selectList(null); -// } -// -// /** -// * 获取任务计划分页列表 -// */ -// @RequestMapping(value = "/listPage") -// @ResponseBody -// public Object listPage(String condition) { -// Page page = new PageFactory().defaultPage(); -// EntityWrapper query = new EntityWrapper<>(); -// page = busPlanService.selectPage(page,query); -// return super.packForBT(page); -// } -// /** -// * 新增任务计划 -// */ -// @RequestMapping(value = "/add") -// @ResponseBody -// public Object add(BusPlan busPlan) { -// busPlanService.insert(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 删除任务计划 +// * 任务启用或停止 // */ // @RequestMapping(value = "/delete") // @ResponseBody -// public Object delete(@RequestParam String busPlanId) { -// busPlanService.deleteById(busPlanId); -// return SUCCESS_TIP; +// public Object delete(@RequestBody @Valid IdDTO idDTO) { +// Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); +// return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); // } -// -// /** -// * 批量删除 -// */ -// @RequestMapping(value = "/batchDelete") -// @ResponseBody -// public Object delete(@RequestParam("busPlanIds") List busPlanIds) { -// busPlanService.deleteBatchIds(busPlanIds); -// return SUCCESS_TIP; -// } -// -// /** -// * 修改任务计划 -// */ -// @RequestMapping(value = "/update") -// @ResponseBody -// public Object update(BusPlan busPlan) { -// busPlanService.updateById(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 任务计划详情 -// */ -// @RequestMapping(value = "/detail/{busPlanId}") -// @ResponseBody -// public Object detail(@PathVariable("busPlanId") String busPlanId) { -// ResultData resultData = new ResultData(); -// resultData.setCode(200); -// resultData.setMessage("查询详情成功"); -// resultData.setData(busPlanService.selectById(busPlanId)); -// return resultData; -// } -//} + + + /** + * 修改任务计划 + */ + @RequestMapping(value = "/edit") + @ResponseBody + public Object edit(@RequestBody @Valid BusPlan busPlan) { + Assert.isFalse(Objects.isNull(busPlan.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("更新失败"); + } + +} diff --git a/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java new file mode 100644 index 0000000..c9068b7 --- /dev/null +++ b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface StatusEnum { + //任务开启 + String STATUS_OPEN = "1"; + //任务关闭 + String STATUS_CLOSE = "0"; + + +} diff --git a/casic-data/pom.xml b/casic-data/pom.xml index 7b9d140..aca0a62 100644 --- a/casic-data/pom.xml +++ b/casic-data/pom.xml @@ -52,6 +52,13 @@ 2.0.0 compile + + com.casic + casic-quartz + 2.0.0 + compile + + diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java index 78b93e8..cbb235e 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java @@ -1,105 +1,106 @@ -//package com.casic.missiles.modular.system.controller; -// -//import com.casic.missiles.core.base.controller.ExportController; -//import com.stylefeng.guns.core.result.ResultData; -//import org.springframework.stereotype.Controller; -//import org.springframework.web.bind.annotation.RequestMapping; -//import org.springframework.web.bind.annotation.ResponseBody; -//import org.springframework.web.bind.annotation.PathVariable; -//import org.springframework.beans.factory.annotation.Autowired; -//import com.casic.missiles.core.page.PageFactory; -//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -//import java.util.List; -//import com.stylefeng.guns.core.common.constant.factory.PageFactory; -//import org.springframework.web.bind.annotation.RequestParam; -//import com.stylefeng.guns.modular.system.model.BusPlan; -//import com.stylefeng.guns.modular.system.service.IBusPlanService; -// -///** -// * 任务计划控制器 -// * -// * @author dev -// * @Date 2023-04-18 15:44:40 -// */ -//@Controller -//@RequestMapping("/busPlan") -//public class BusPlanController extends ExportController { -// -// -// @Autowired -// private IBusPlanService busPlanService; -// -// +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.model.BusPlan; +import com.casic.missiles.modular.system.service.IBusPlanService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.validation.Valid; +import java.util.Objects; + +/** + * 任务计划控制器 + * + * @author dev + * @Date 2023-04-18 15:44:40 + */ +@Controller +@RequestMapping("/task") +public class BusPlanController extends ExportController { + + + @Autowired + private IBusPlanService busPlanService; + + + /** + * 获取任务计划列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String condition) { + return busPlanService.list(null); + } + + /** + * 获取任务计划分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = new QueryWrapper<>(); + page = busPlanService.page(page, query); + return super.packForBT(page); + } + + /** + * 新增任务计划 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusPlan busPlan) { + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("新增失败"); + + } + + /** + * 删除任务计划 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); + } + // /** -// * 获取任务计划列表 -// */ -// @RequestMapping(value = "/list") -// @ResponseBody -// public Object list(String condition) { -// return busPlanService.selectList(null); -// } -// -// /** -// * 获取任务计划分页列表 -// */ -// @RequestMapping(value = "/listPage") -// @ResponseBody -// public Object listPage(String condition) { -// Page page = new PageFactory().defaultPage(); -// EntityWrapper query = new EntityWrapper<>(); -// page = busPlanService.selectPage(page,query); -// return super.packForBT(page); -// } -// /** -// * 新增任务计划 -// */ -// @RequestMapping(value = "/add") -// @ResponseBody -// public Object add(BusPlan busPlan) { -// busPlanService.insert(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 删除任务计划 +// * 任务启用或停止 // */ // @RequestMapping(value = "/delete") // @ResponseBody -// public Object delete(@RequestParam String busPlanId) { -// busPlanService.deleteById(busPlanId); -// return SUCCESS_TIP; +// public Object delete(@RequestBody @Valid IdDTO idDTO) { +// Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); +// return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); // } -// -// /** -// * 批量删除 -// */ -// @RequestMapping(value = "/batchDelete") -// @ResponseBody -// public Object delete(@RequestParam("busPlanIds") List busPlanIds) { -// busPlanService.deleteBatchIds(busPlanIds); -// return SUCCESS_TIP; -// } -// -// /** -// * 修改任务计划 -// */ -// @RequestMapping(value = "/update") -// @ResponseBody -// public Object update(BusPlan busPlan) { -// busPlanService.updateById(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 任务计划详情 -// */ -// @RequestMapping(value = "/detail/{busPlanId}") -// @ResponseBody -// public Object detail(@PathVariable("busPlanId") String busPlanId) { -// ResultData resultData = new ResultData(); -// resultData.setCode(200); -// resultData.setMessage("查询详情成功"); -// resultData.setData(busPlanService.selectById(busPlanId)); -// return resultData; -// } -//} + + + /** + * 修改任务计划 + */ + @RequestMapping(value = "/edit") + @ResponseBody + public Object edit(@RequestBody @Valid BusPlan busPlan) { + Assert.isFalse(Objects.isNull(busPlan.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("更新失败"); + } + +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java new file mode 100644 index 0000000..fc97688 --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StartTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StartTaskJob.class); + + private String jobId; + + + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(String id) { + //toDo:开启巡航 + + System.out.println("开始执行了------"); + } +} diff --git a/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java new file mode 100644 index 0000000..c9068b7 --- /dev/null +++ b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface StatusEnum { + //任务开启 + String STATUS_OPEN = "1"; + //任务关闭 + String STATUS_CLOSE = "0"; + + +} diff --git a/casic-data/pom.xml b/casic-data/pom.xml index 7b9d140..aca0a62 100644 --- a/casic-data/pom.xml +++ b/casic-data/pom.xml @@ -52,6 +52,13 @@ 2.0.0 compile + + com.casic + casic-quartz + 2.0.0 + compile + + diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java index 78b93e8..cbb235e 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java @@ -1,105 +1,106 @@ -//package com.casic.missiles.modular.system.controller; -// -//import com.casic.missiles.core.base.controller.ExportController; -//import com.stylefeng.guns.core.result.ResultData; -//import org.springframework.stereotype.Controller; -//import org.springframework.web.bind.annotation.RequestMapping; -//import org.springframework.web.bind.annotation.ResponseBody; -//import org.springframework.web.bind.annotation.PathVariable; -//import org.springframework.beans.factory.annotation.Autowired; -//import com.casic.missiles.core.page.PageFactory; -//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -//import java.util.List; -//import com.stylefeng.guns.core.common.constant.factory.PageFactory; -//import org.springframework.web.bind.annotation.RequestParam; -//import com.stylefeng.guns.modular.system.model.BusPlan; -//import com.stylefeng.guns.modular.system.service.IBusPlanService; -// -///** -// * 任务计划控制器 -// * -// * @author dev -// * @Date 2023-04-18 15:44:40 -// */ -//@Controller -//@RequestMapping("/busPlan") -//public class BusPlanController extends ExportController { -// -// -// @Autowired -// private IBusPlanService busPlanService; -// -// +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.model.BusPlan; +import com.casic.missiles.modular.system.service.IBusPlanService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.validation.Valid; +import java.util.Objects; + +/** + * 任务计划控制器 + * + * @author dev + * @Date 2023-04-18 15:44:40 + */ +@Controller +@RequestMapping("/task") +public class BusPlanController extends ExportController { + + + @Autowired + private IBusPlanService busPlanService; + + + /** + * 获取任务计划列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String condition) { + return busPlanService.list(null); + } + + /** + * 获取任务计划分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = new QueryWrapper<>(); + page = busPlanService.page(page, query); + return super.packForBT(page); + } + + /** + * 新增任务计划 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusPlan busPlan) { + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("新增失败"); + + } + + /** + * 删除任务计划 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); + } + // /** -// * 获取任务计划列表 -// */ -// @RequestMapping(value = "/list") -// @ResponseBody -// public Object list(String condition) { -// return busPlanService.selectList(null); -// } -// -// /** -// * 获取任务计划分页列表 -// */ -// @RequestMapping(value = "/listPage") -// @ResponseBody -// public Object listPage(String condition) { -// Page page = new PageFactory().defaultPage(); -// EntityWrapper query = new EntityWrapper<>(); -// page = busPlanService.selectPage(page,query); -// return super.packForBT(page); -// } -// /** -// * 新增任务计划 -// */ -// @RequestMapping(value = "/add") -// @ResponseBody -// public Object add(BusPlan busPlan) { -// busPlanService.insert(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 删除任务计划 +// * 任务启用或停止 // */ // @RequestMapping(value = "/delete") // @ResponseBody -// public Object delete(@RequestParam String busPlanId) { -// busPlanService.deleteById(busPlanId); -// return SUCCESS_TIP; +// public Object delete(@RequestBody @Valid IdDTO idDTO) { +// Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); +// return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); // } -// -// /** -// * 批量删除 -// */ -// @RequestMapping(value = "/batchDelete") -// @ResponseBody -// public Object delete(@RequestParam("busPlanIds") List busPlanIds) { -// busPlanService.deleteBatchIds(busPlanIds); -// return SUCCESS_TIP; -// } -// -// /** -// * 修改任务计划 -// */ -// @RequestMapping(value = "/update") -// @ResponseBody -// public Object update(BusPlan busPlan) { -// busPlanService.updateById(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 任务计划详情 -// */ -// @RequestMapping(value = "/detail/{busPlanId}") -// @ResponseBody -// public Object detail(@PathVariable("busPlanId") String busPlanId) { -// ResultData resultData = new ResultData(); -// resultData.setCode(200); -// resultData.setMessage("查询详情成功"); -// resultData.setData(busPlanService.selectById(busPlanId)); -// return resultData; -// } -//} + + + /** + * 修改任务计划 + */ + @RequestMapping(value = "/edit") + @ResponseBody + public Object edit(@RequestBody @Valid BusPlan busPlan) { + Assert.isFalse(Objects.isNull(busPlan.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("更新失败"); + } + +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java new file mode 100644 index 0000000..fc97688 --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StartTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StartTaskJob.class); + + private String jobId; + + + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(String id) { + //toDo:开启巡航 + + System.out.println("开始执行了------"); + } +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java new file mode 100644 index 0000000..0cd49ec --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java @@ -0,0 +1,42 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StopTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StopTaskJob.class); + + private Integer jobId; + + + + public void setJobId(Integer jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(Integer id) { + + //toDo:关闭巡航 + + System.out.println("停止执行了------"); + } +} diff --git a/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java new file mode 100644 index 0000000..c9068b7 --- /dev/null +++ b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface StatusEnum { + //任务开启 + String STATUS_OPEN = "1"; + //任务关闭 + String STATUS_CLOSE = "0"; + + +} diff --git a/casic-data/pom.xml b/casic-data/pom.xml index 7b9d140..aca0a62 100644 --- a/casic-data/pom.xml +++ b/casic-data/pom.xml @@ -52,6 +52,13 @@ 2.0.0 compile + + com.casic + casic-quartz + 2.0.0 + compile + + diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java index 78b93e8..cbb235e 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java @@ -1,105 +1,106 @@ -//package com.casic.missiles.modular.system.controller; -// -//import com.casic.missiles.core.base.controller.ExportController; -//import com.stylefeng.guns.core.result.ResultData; -//import org.springframework.stereotype.Controller; -//import org.springframework.web.bind.annotation.RequestMapping; -//import org.springframework.web.bind.annotation.ResponseBody; -//import org.springframework.web.bind.annotation.PathVariable; -//import org.springframework.beans.factory.annotation.Autowired; -//import com.casic.missiles.core.page.PageFactory; -//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -//import java.util.List; -//import com.stylefeng.guns.core.common.constant.factory.PageFactory; -//import org.springframework.web.bind.annotation.RequestParam; -//import com.stylefeng.guns.modular.system.model.BusPlan; -//import com.stylefeng.guns.modular.system.service.IBusPlanService; -// -///** -// * 任务计划控制器 -// * -// * @author dev -// * @Date 2023-04-18 15:44:40 -// */ -//@Controller -//@RequestMapping("/busPlan") -//public class BusPlanController extends ExportController { -// -// -// @Autowired -// private IBusPlanService busPlanService; -// -// +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.model.BusPlan; +import com.casic.missiles.modular.system.service.IBusPlanService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.validation.Valid; +import java.util.Objects; + +/** + * 任务计划控制器 + * + * @author dev + * @Date 2023-04-18 15:44:40 + */ +@Controller +@RequestMapping("/task") +public class BusPlanController extends ExportController { + + + @Autowired + private IBusPlanService busPlanService; + + + /** + * 获取任务计划列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String condition) { + return busPlanService.list(null); + } + + /** + * 获取任务计划分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = new QueryWrapper<>(); + page = busPlanService.page(page, query); + return super.packForBT(page); + } + + /** + * 新增任务计划 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusPlan busPlan) { + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("新增失败"); + + } + + /** + * 删除任务计划 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); + } + // /** -// * 获取任务计划列表 -// */ -// @RequestMapping(value = "/list") -// @ResponseBody -// public Object list(String condition) { -// return busPlanService.selectList(null); -// } -// -// /** -// * 获取任务计划分页列表 -// */ -// @RequestMapping(value = "/listPage") -// @ResponseBody -// public Object listPage(String condition) { -// Page page = new PageFactory().defaultPage(); -// EntityWrapper query = new EntityWrapper<>(); -// page = busPlanService.selectPage(page,query); -// return super.packForBT(page); -// } -// /** -// * 新增任务计划 -// */ -// @RequestMapping(value = "/add") -// @ResponseBody -// public Object add(BusPlan busPlan) { -// busPlanService.insert(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 删除任务计划 +// * 任务启用或停止 // */ // @RequestMapping(value = "/delete") // @ResponseBody -// public Object delete(@RequestParam String busPlanId) { -// busPlanService.deleteById(busPlanId); -// return SUCCESS_TIP; +// public Object delete(@RequestBody @Valid IdDTO idDTO) { +// Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); +// return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); // } -// -// /** -// * 批量删除 -// */ -// @RequestMapping(value = "/batchDelete") -// @ResponseBody -// public Object delete(@RequestParam("busPlanIds") List busPlanIds) { -// busPlanService.deleteBatchIds(busPlanIds); -// return SUCCESS_TIP; -// } -// -// /** -// * 修改任务计划 -// */ -// @RequestMapping(value = "/update") -// @ResponseBody -// public Object update(BusPlan busPlan) { -// busPlanService.updateById(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 任务计划详情 -// */ -// @RequestMapping(value = "/detail/{busPlanId}") -// @ResponseBody -// public Object detail(@PathVariable("busPlanId") String busPlanId) { -// ResultData resultData = new ResultData(); -// resultData.setCode(200); -// resultData.setMessage("查询详情成功"); -// resultData.setData(busPlanService.selectById(busPlanId)); -// return resultData; -// } -//} + + + /** + * 修改任务计划 + */ + @RequestMapping(value = "/edit") + @ResponseBody + public Object edit(@RequestBody @Valid BusPlan busPlan) { + Assert.isFalse(Objects.isNull(busPlan.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("更新失败"); + } + +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java new file mode 100644 index 0000000..fc97688 --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StartTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StartTaskJob.class); + + private String jobId; + + + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(String id) { + //toDo:开启巡航 + + System.out.println("开始执行了------"); + } +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java new file mode 100644 index 0000000..0cd49ec --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java @@ -0,0 +1,42 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StopTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StopTaskJob.class); + + private Integer jobId; + + + + public void setJobId(Integer jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(Integer id) { + + //toDo:关闭巡航 + + System.out.println("停止执行了------"); + } +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java b/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java index 0f648dd..aed7813 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java @@ -13,4 +13,6 @@ */ public interface IBusPlanService extends IService { + boolean saveOrUpdateBusPlan(BusPlan busPlan); + } diff --git a/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java new file mode 100644 index 0000000..c9068b7 --- /dev/null +++ b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface StatusEnum { + //任务开启 + String STATUS_OPEN = "1"; + //任务关闭 + String STATUS_CLOSE = "0"; + + +} diff --git a/casic-data/pom.xml b/casic-data/pom.xml index 7b9d140..aca0a62 100644 --- a/casic-data/pom.xml +++ b/casic-data/pom.xml @@ -52,6 +52,13 @@ 2.0.0 compile + + com.casic + casic-quartz + 2.0.0 + compile + + diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java index 78b93e8..cbb235e 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java @@ -1,105 +1,106 @@ -//package com.casic.missiles.modular.system.controller; -// -//import com.casic.missiles.core.base.controller.ExportController; -//import com.stylefeng.guns.core.result.ResultData; -//import org.springframework.stereotype.Controller; -//import org.springframework.web.bind.annotation.RequestMapping; -//import org.springframework.web.bind.annotation.ResponseBody; -//import org.springframework.web.bind.annotation.PathVariable; -//import org.springframework.beans.factory.annotation.Autowired; -//import com.casic.missiles.core.page.PageFactory; -//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -//import java.util.List; -//import com.stylefeng.guns.core.common.constant.factory.PageFactory; -//import org.springframework.web.bind.annotation.RequestParam; -//import com.stylefeng.guns.modular.system.model.BusPlan; -//import com.stylefeng.guns.modular.system.service.IBusPlanService; -// -///** -// * 任务计划控制器 -// * -// * @author dev -// * @Date 2023-04-18 15:44:40 -// */ -//@Controller -//@RequestMapping("/busPlan") -//public class BusPlanController extends ExportController { -// -// -// @Autowired -// private IBusPlanService busPlanService; -// -// +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.model.BusPlan; +import com.casic.missiles.modular.system.service.IBusPlanService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.validation.Valid; +import java.util.Objects; + +/** + * 任务计划控制器 + * + * @author dev + * @Date 2023-04-18 15:44:40 + */ +@Controller +@RequestMapping("/task") +public class BusPlanController extends ExportController { + + + @Autowired + private IBusPlanService busPlanService; + + + /** + * 获取任务计划列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String condition) { + return busPlanService.list(null); + } + + /** + * 获取任务计划分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = new QueryWrapper<>(); + page = busPlanService.page(page, query); + return super.packForBT(page); + } + + /** + * 新增任务计划 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusPlan busPlan) { + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("新增失败"); + + } + + /** + * 删除任务计划 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); + } + // /** -// * 获取任务计划列表 -// */ -// @RequestMapping(value = "/list") -// @ResponseBody -// public Object list(String condition) { -// return busPlanService.selectList(null); -// } -// -// /** -// * 获取任务计划分页列表 -// */ -// @RequestMapping(value = "/listPage") -// @ResponseBody -// public Object listPage(String condition) { -// Page page = new PageFactory().defaultPage(); -// EntityWrapper query = new EntityWrapper<>(); -// page = busPlanService.selectPage(page,query); -// return super.packForBT(page); -// } -// /** -// * 新增任务计划 -// */ -// @RequestMapping(value = "/add") -// @ResponseBody -// public Object add(BusPlan busPlan) { -// busPlanService.insert(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 删除任务计划 +// * 任务启用或停止 // */ // @RequestMapping(value = "/delete") // @ResponseBody -// public Object delete(@RequestParam String busPlanId) { -// busPlanService.deleteById(busPlanId); -// return SUCCESS_TIP; +// public Object delete(@RequestBody @Valid IdDTO idDTO) { +// Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); +// return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); // } -// -// /** -// * 批量删除 -// */ -// @RequestMapping(value = "/batchDelete") -// @ResponseBody -// public Object delete(@RequestParam("busPlanIds") List busPlanIds) { -// busPlanService.deleteBatchIds(busPlanIds); -// return SUCCESS_TIP; -// } -// -// /** -// * 修改任务计划 -// */ -// @RequestMapping(value = "/update") -// @ResponseBody -// public Object update(BusPlan busPlan) { -// busPlanService.updateById(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 任务计划详情 -// */ -// @RequestMapping(value = "/detail/{busPlanId}") -// @ResponseBody -// public Object detail(@PathVariable("busPlanId") String busPlanId) { -// ResultData resultData = new ResultData(); -// resultData.setCode(200); -// resultData.setMessage("查询详情成功"); -// resultData.setData(busPlanService.selectById(busPlanId)); -// return resultData; -// } -//} + + + /** + * 修改任务计划 + */ + @RequestMapping(value = "/edit") + @ResponseBody + public Object edit(@RequestBody @Valid BusPlan busPlan) { + Assert.isFalse(Objects.isNull(busPlan.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("更新失败"); + } + +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java new file mode 100644 index 0000000..fc97688 --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StartTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StartTaskJob.class); + + private String jobId; + + + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(String id) { + //toDo:开启巡航 + + System.out.println("开始执行了------"); + } +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java new file mode 100644 index 0000000..0cd49ec --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java @@ -0,0 +1,42 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StopTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StopTaskJob.class); + + private Integer jobId; + + + + public void setJobId(Integer jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(Integer id) { + + //toDo:关闭巡航 + + System.out.println("停止执行了------"); + } +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java b/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java index 0f648dd..aed7813 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java @@ -13,4 +13,6 @@ */ public interface IBusPlanService extends IService { + boolean saveOrUpdateBusPlan(BusPlan busPlan); + } diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java b/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java index 1df7e2e..a46b298 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java @@ -1,11 +1,22 @@ package com.casic.missiles.modular.system.service.impl; -import com.casic.missiles.modular.system.model.BusPlan; -import com.casic.missiles.modular.system.dao.BusPlanMapper; -import com.casic.missiles.modular.system.service.IBusPlanService; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.enums.StatusEnum; +import com.casic.missiles.modular.system.dao.BusPlanMapper; +import com.casic.missiles.modular.system.job.StartTaskJob; +import com.casic.missiles.modular.system.job.StopTaskJob; +import com.casic.missiles.modular.system.model.BusPlan; +import com.casic.missiles.modular.system.service.IBusPlanService; +import com.casic.missiles.quartz.service.IQuartzManager; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + /** *

* 任务计划表 服务实现类 @@ -17,4 +28,34 @@ @Service public class BusPlanServiceImpl extends ServiceImpl implements IBusPlanService { + @Autowired + private IQuartzManager quartzManager; + + @Override + public boolean saveOrUpdateBusPlan(BusPlan busPlan) { + //先保存数据 + if (this.saveOrUpdate(busPlan)) { + //若已启动任务,则创建启动job任务 + if (StatusEnum.STATUS_OPEN.equals(busPlan.getStatus())) { + //到时间开启 + if (ObjectUtil.isNotEmpty(busPlan.getBeginDate()) && ObjectUtil.isNotEmpty(busPlan.getBeginTime())) { + Date startTaskTime = DateUtil.parseDateTime(busPlan.getBeginDate()+" "+busPlan.getBeginTime()); + String jobName = "startPatrolTask" + busPlan.getId(); + Map map = new HashMap<>(); + map.put("jobId", busPlan.getId()); + quartzManager.addJob(jobName, StartTaskJob.class, startTaskTime, map); + } + //到时间关闭 + if (ObjectUtil.isNotEmpty(busPlan.getEndDate()) && ObjectUtil.isNotEmpty(busPlan.getEndTime())) { + Date endTaskTime = DateUtil.parseDateTime(busPlan.getEndDate()+" "+busPlan.getEndTime()); + String jobName = "endPatrolTask" + busPlan.getId(); + Map map = new HashMap<>(); + map.put("jobId", busPlan.getId()); + quartzManager.addJob(jobName, StopTaskJob.class, endTaskTime, map); + } + } + return true; + } + return false; + } } diff --git a/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java new file mode 100644 index 0000000..c9068b7 --- /dev/null +++ b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface StatusEnum { + //任务开启 + String STATUS_OPEN = "1"; + //任务关闭 + String STATUS_CLOSE = "0"; + + +} diff --git a/casic-data/pom.xml b/casic-data/pom.xml index 7b9d140..aca0a62 100644 --- a/casic-data/pom.xml +++ b/casic-data/pom.xml @@ -52,6 +52,13 @@ 2.0.0 compile + + com.casic + casic-quartz + 2.0.0 + compile + + diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java index 78b93e8..cbb235e 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java @@ -1,105 +1,106 @@ -//package com.casic.missiles.modular.system.controller; -// -//import com.casic.missiles.core.base.controller.ExportController; -//import com.stylefeng.guns.core.result.ResultData; -//import org.springframework.stereotype.Controller; -//import org.springframework.web.bind.annotation.RequestMapping; -//import org.springframework.web.bind.annotation.ResponseBody; -//import org.springframework.web.bind.annotation.PathVariable; -//import org.springframework.beans.factory.annotation.Autowired; -//import com.casic.missiles.core.page.PageFactory; -//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -//import java.util.List; -//import com.stylefeng.guns.core.common.constant.factory.PageFactory; -//import org.springframework.web.bind.annotation.RequestParam; -//import com.stylefeng.guns.modular.system.model.BusPlan; -//import com.stylefeng.guns.modular.system.service.IBusPlanService; -// -///** -// * 任务计划控制器 -// * -// * @author dev -// * @Date 2023-04-18 15:44:40 -// */ -//@Controller -//@RequestMapping("/busPlan") -//public class BusPlanController extends ExportController { -// -// -// @Autowired -// private IBusPlanService busPlanService; -// -// +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.model.BusPlan; +import com.casic.missiles.modular.system.service.IBusPlanService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.validation.Valid; +import java.util.Objects; + +/** + * 任务计划控制器 + * + * @author dev + * @Date 2023-04-18 15:44:40 + */ +@Controller +@RequestMapping("/task") +public class BusPlanController extends ExportController { + + + @Autowired + private IBusPlanService busPlanService; + + + /** + * 获取任务计划列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String condition) { + return busPlanService.list(null); + } + + /** + * 获取任务计划分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = new QueryWrapper<>(); + page = busPlanService.page(page, query); + return super.packForBT(page); + } + + /** + * 新增任务计划 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusPlan busPlan) { + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("新增失败"); + + } + + /** + * 删除任务计划 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); + } + // /** -// * 获取任务计划列表 -// */ -// @RequestMapping(value = "/list") -// @ResponseBody -// public Object list(String condition) { -// return busPlanService.selectList(null); -// } -// -// /** -// * 获取任务计划分页列表 -// */ -// @RequestMapping(value = "/listPage") -// @ResponseBody -// public Object listPage(String condition) { -// Page page = new PageFactory().defaultPage(); -// EntityWrapper query = new EntityWrapper<>(); -// page = busPlanService.selectPage(page,query); -// return super.packForBT(page); -// } -// /** -// * 新增任务计划 -// */ -// @RequestMapping(value = "/add") -// @ResponseBody -// public Object add(BusPlan busPlan) { -// busPlanService.insert(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 删除任务计划 +// * 任务启用或停止 // */ // @RequestMapping(value = "/delete") // @ResponseBody -// public Object delete(@RequestParam String busPlanId) { -// busPlanService.deleteById(busPlanId); -// return SUCCESS_TIP; +// public Object delete(@RequestBody @Valid IdDTO idDTO) { +// Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); +// return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); // } -// -// /** -// * 批量删除 -// */ -// @RequestMapping(value = "/batchDelete") -// @ResponseBody -// public Object delete(@RequestParam("busPlanIds") List busPlanIds) { -// busPlanService.deleteBatchIds(busPlanIds); -// return SUCCESS_TIP; -// } -// -// /** -// * 修改任务计划 -// */ -// @RequestMapping(value = "/update") -// @ResponseBody -// public Object update(BusPlan busPlan) { -// busPlanService.updateById(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 任务计划详情 -// */ -// @RequestMapping(value = "/detail/{busPlanId}") -// @ResponseBody -// public Object detail(@PathVariable("busPlanId") String busPlanId) { -// ResultData resultData = new ResultData(); -// resultData.setCode(200); -// resultData.setMessage("查询详情成功"); -// resultData.setData(busPlanService.selectById(busPlanId)); -// return resultData; -// } -//} + + + /** + * 修改任务计划 + */ + @RequestMapping(value = "/edit") + @ResponseBody + public Object edit(@RequestBody @Valid BusPlan busPlan) { + Assert.isFalse(Objects.isNull(busPlan.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("更新失败"); + } + +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java new file mode 100644 index 0000000..fc97688 --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StartTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StartTaskJob.class); + + private String jobId; + + + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(String id) { + //toDo:开启巡航 + + System.out.println("开始执行了------"); + } +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java new file mode 100644 index 0000000..0cd49ec --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java @@ -0,0 +1,42 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StopTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StopTaskJob.class); + + private Integer jobId; + + + + public void setJobId(Integer jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(Integer id) { + + //toDo:关闭巡航 + + System.out.println("停止执行了------"); + } +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java b/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java index 0f648dd..aed7813 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java @@ -13,4 +13,6 @@ */ public interface IBusPlanService extends IService { + boolean saveOrUpdateBusPlan(BusPlan busPlan); + } diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java b/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java index 1df7e2e..a46b298 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java @@ -1,11 +1,22 @@ package com.casic.missiles.modular.system.service.impl; -import com.casic.missiles.modular.system.model.BusPlan; -import com.casic.missiles.modular.system.dao.BusPlanMapper; -import com.casic.missiles.modular.system.service.IBusPlanService; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.enums.StatusEnum; +import com.casic.missiles.modular.system.dao.BusPlanMapper; +import com.casic.missiles.modular.system.job.StartTaskJob; +import com.casic.missiles.modular.system.job.StopTaskJob; +import com.casic.missiles.modular.system.model.BusPlan; +import com.casic.missiles.modular.system.service.IBusPlanService; +import com.casic.missiles.quartz.service.IQuartzManager; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + /** *

* 任务计划表 服务实现类 @@ -17,4 +28,34 @@ @Service public class BusPlanServiceImpl extends ServiceImpl implements IBusPlanService { + @Autowired + private IQuartzManager quartzManager; + + @Override + public boolean saveOrUpdateBusPlan(BusPlan busPlan) { + //先保存数据 + if (this.saveOrUpdate(busPlan)) { + //若已启动任务,则创建启动job任务 + if (StatusEnum.STATUS_OPEN.equals(busPlan.getStatus())) { + //到时间开启 + if (ObjectUtil.isNotEmpty(busPlan.getBeginDate()) && ObjectUtil.isNotEmpty(busPlan.getBeginTime())) { + Date startTaskTime = DateUtil.parseDateTime(busPlan.getBeginDate()+" "+busPlan.getBeginTime()); + String jobName = "startPatrolTask" + busPlan.getId(); + Map map = new HashMap<>(); + map.put("jobId", busPlan.getId()); + quartzManager.addJob(jobName, StartTaskJob.class, startTaskTime, map); + } + //到时间关闭 + if (ObjectUtil.isNotEmpty(busPlan.getEndDate()) && ObjectUtil.isNotEmpty(busPlan.getEndTime())) { + Date endTaskTime = DateUtil.parseDateTime(busPlan.getEndDate()+" "+busPlan.getEndTime()); + String jobName = "endPatrolTask" + busPlan.getId(); + Map map = new HashMap<>(); + map.put("jobId", busPlan.getId()); + quartzManager.addJob(jobName, StopTaskJob.class, endTaskTime, map); + } + } + return true; + } + return false; + } } diff --git a/casic-quartz/pom.xml b/casic-quartz/pom.xml new file mode 100644 index 0000000..1874a17 --- /dev/null +++ b/casic-quartz/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + + com.casic + casic-PTZ + 2.0.0 + ../pom.xml + + + casic-quartz + 2.0.0 + jar + + + + org.springframework.boot + spring-boot-starter-aop + + + org.quartz-scheduler + quartz + 2.3.0 + + + com.mchange + c3p0 + 0.9.5.2 + + + org.springframework + spring-context-support + 5.0.5.RELEASE + + + + \ No newline at end of file diff --git a/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java new file mode 100644 index 0000000..c9068b7 --- /dev/null +++ b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface StatusEnum { + //任务开启 + String STATUS_OPEN = "1"; + //任务关闭 + String STATUS_CLOSE = "0"; + + +} diff --git a/casic-data/pom.xml b/casic-data/pom.xml index 7b9d140..aca0a62 100644 --- a/casic-data/pom.xml +++ b/casic-data/pom.xml @@ -52,6 +52,13 @@ 2.0.0 compile + + com.casic + casic-quartz + 2.0.0 + compile + + diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java index 78b93e8..cbb235e 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java @@ -1,105 +1,106 @@ -//package com.casic.missiles.modular.system.controller; -// -//import com.casic.missiles.core.base.controller.ExportController; -//import com.stylefeng.guns.core.result.ResultData; -//import org.springframework.stereotype.Controller; -//import org.springframework.web.bind.annotation.RequestMapping; -//import org.springframework.web.bind.annotation.ResponseBody; -//import org.springframework.web.bind.annotation.PathVariable; -//import org.springframework.beans.factory.annotation.Autowired; -//import com.casic.missiles.core.page.PageFactory; -//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -//import java.util.List; -//import com.stylefeng.guns.core.common.constant.factory.PageFactory; -//import org.springframework.web.bind.annotation.RequestParam; -//import com.stylefeng.guns.modular.system.model.BusPlan; -//import com.stylefeng.guns.modular.system.service.IBusPlanService; -// -///** -// * 任务计划控制器 -// * -// * @author dev -// * @Date 2023-04-18 15:44:40 -// */ -//@Controller -//@RequestMapping("/busPlan") -//public class BusPlanController extends ExportController { -// -// -// @Autowired -// private IBusPlanService busPlanService; -// -// +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.model.BusPlan; +import com.casic.missiles.modular.system.service.IBusPlanService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.validation.Valid; +import java.util.Objects; + +/** + * 任务计划控制器 + * + * @author dev + * @Date 2023-04-18 15:44:40 + */ +@Controller +@RequestMapping("/task") +public class BusPlanController extends ExportController { + + + @Autowired + private IBusPlanService busPlanService; + + + /** + * 获取任务计划列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String condition) { + return busPlanService.list(null); + } + + /** + * 获取任务计划分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = new QueryWrapper<>(); + page = busPlanService.page(page, query); + return super.packForBT(page); + } + + /** + * 新增任务计划 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusPlan busPlan) { + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("新增失败"); + + } + + /** + * 删除任务计划 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); + } + // /** -// * 获取任务计划列表 -// */ -// @RequestMapping(value = "/list") -// @ResponseBody -// public Object list(String condition) { -// return busPlanService.selectList(null); -// } -// -// /** -// * 获取任务计划分页列表 -// */ -// @RequestMapping(value = "/listPage") -// @ResponseBody -// public Object listPage(String condition) { -// Page page = new PageFactory().defaultPage(); -// EntityWrapper query = new EntityWrapper<>(); -// page = busPlanService.selectPage(page,query); -// return super.packForBT(page); -// } -// /** -// * 新增任务计划 -// */ -// @RequestMapping(value = "/add") -// @ResponseBody -// public Object add(BusPlan busPlan) { -// busPlanService.insert(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 删除任务计划 +// * 任务启用或停止 // */ // @RequestMapping(value = "/delete") // @ResponseBody -// public Object delete(@RequestParam String busPlanId) { -// busPlanService.deleteById(busPlanId); -// return SUCCESS_TIP; +// public Object delete(@RequestBody @Valid IdDTO idDTO) { +// Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); +// return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); // } -// -// /** -// * 批量删除 -// */ -// @RequestMapping(value = "/batchDelete") -// @ResponseBody -// public Object delete(@RequestParam("busPlanIds") List busPlanIds) { -// busPlanService.deleteBatchIds(busPlanIds); -// return SUCCESS_TIP; -// } -// -// /** -// * 修改任务计划 -// */ -// @RequestMapping(value = "/update") -// @ResponseBody -// public Object update(BusPlan busPlan) { -// busPlanService.updateById(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 任务计划详情 -// */ -// @RequestMapping(value = "/detail/{busPlanId}") -// @ResponseBody -// public Object detail(@PathVariable("busPlanId") String busPlanId) { -// ResultData resultData = new ResultData(); -// resultData.setCode(200); -// resultData.setMessage("查询详情成功"); -// resultData.setData(busPlanService.selectById(busPlanId)); -// return resultData; -// } -//} + + + /** + * 修改任务计划 + */ + @RequestMapping(value = "/edit") + @ResponseBody + public Object edit(@RequestBody @Valid BusPlan busPlan) { + Assert.isFalse(Objects.isNull(busPlan.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("更新失败"); + } + +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java new file mode 100644 index 0000000..fc97688 --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StartTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StartTaskJob.class); + + private String jobId; + + + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(String id) { + //toDo:开启巡航 + + System.out.println("开始执行了------"); + } +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java new file mode 100644 index 0000000..0cd49ec --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java @@ -0,0 +1,42 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StopTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StopTaskJob.class); + + private Integer jobId; + + + + public void setJobId(Integer jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(Integer id) { + + //toDo:关闭巡航 + + System.out.println("停止执行了------"); + } +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java b/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java index 0f648dd..aed7813 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java @@ -13,4 +13,6 @@ */ public interface IBusPlanService extends IService { + boolean saveOrUpdateBusPlan(BusPlan busPlan); + } diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java b/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java index 1df7e2e..a46b298 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java @@ -1,11 +1,22 @@ package com.casic.missiles.modular.system.service.impl; -import com.casic.missiles.modular.system.model.BusPlan; -import com.casic.missiles.modular.system.dao.BusPlanMapper; -import com.casic.missiles.modular.system.service.IBusPlanService; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.enums.StatusEnum; +import com.casic.missiles.modular.system.dao.BusPlanMapper; +import com.casic.missiles.modular.system.job.StartTaskJob; +import com.casic.missiles.modular.system.job.StopTaskJob; +import com.casic.missiles.modular.system.model.BusPlan; +import com.casic.missiles.modular.system.service.IBusPlanService; +import com.casic.missiles.quartz.service.IQuartzManager; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + /** *

* 任务计划表 服务实现类 @@ -17,4 +28,34 @@ @Service public class BusPlanServiceImpl extends ServiceImpl implements IBusPlanService { + @Autowired + private IQuartzManager quartzManager; + + @Override + public boolean saveOrUpdateBusPlan(BusPlan busPlan) { + //先保存数据 + if (this.saveOrUpdate(busPlan)) { + //若已启动任务,则创建启动job任务 + if (StatusEnum.STATUS_OPEN.equals(busPlan.getStatus())) { + //到时间开启 + if (ObjectUtil.isNotEmpty(busPlan.getBeginDate()) && ObjectUtil.isNotEmpty(busPlan.getBeginTime())) { + Date startTaskTime = DateUtil.parseDateTime(busPlan.getBeginDate()+" "+busPlan.getBeginTime()); + String jobName = "startPatrolTask" + busPlan.getId(); + Map map = new HashMap<>(); + map.put("jobId", busPlan.getId()); + quartzManager.addJob(jobName, StartTaskJob.class, startTaskTime, map); + } + //到时间关闭 + if (ObjectUtil.isNotEmpty(busPlan.getEndDate()) && ObjectUtil.isNotEmpty(busPlan.getEndTime())) { + Date endTaskTime = DateUtil.parseDateTime(busPlan.getEndDate()+" "+busPlan.getEndTime()); + String jobName = "endPatrolTask" + busPlan.getId(); + Map map = new HashMap<>(); + map.put("jobId", busPlan.getId()); + quartzManager.addJob(jobName, StopTaskJob.class, endTaskTime, map); + } + } + return true; + } + return false; + } } diff --git a/casic-quartz/pom.xml b/casic-quartz/pom.xml new file mode 100644 index 0000000..1874a17 --- /dev/null +++ b/casic-quartz/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + + com.casic + casic-PTZ + 2.0.0 + ../pom.xml + + + casic-quartz + 2.0.0 + jar + + + + org.springframework.boot + spring-boot-starter-aop + + + org.quartz-scheduler + quartz + 2.3.0 + + + com.mchange + c3p0 + 0.9.5.2 + + + org.springframework + spring-context-support + 5.0.5.RELEASE + + + + \ No newline at end of file diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/StartupRunner.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/StartupRunner.java new file mode 100644 index 0000000..467ef55 --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/StartupRunner.java @@ -0,0 +1,20 @@ +package com.casic.missiles.quartz; + +import com.casic.missiles.quartz.service.IQuartzManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +public class StartupRunner implements CommandLineRunner { + + @Autowired + public IQuartzManager quartzManager; + + @Override + public void run(String... args) { + + quartzManager.resumeJob(); + System.out.println(">>>>>>>>>>>>>>>加载定时任务<<<<<<<<<<<<<"); + } +} \ No newline at end of file diff --git a/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java new file mode 100644 index 0000000..c9068b7 --- /dev/null +++ b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface StatusEnum { + //任务开启 + String STATUS_OPEN = "1"; + //任务关闭 + String STATUS_CLOSE = "0"; + + +} diff --git a/casic-data/pom.xml b/casic-data/pom.xml index 7b9d140..aca0a62 100644 --- a/casic-data/pom.xml +++ b/casic-data/pom.xml @@ -52,6 +52,13 @@ 2.0.0 compile + + com.casic + casic-quartz + 2.0.0 + compile + + diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java index 78b93e8..cbb235e 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java @@ -1,105 +1,106 @@ -//package com.casic.missiles.modular.system.controller; -// -//import com.casic.missiles.core.base.controller.ExportController; -//import com.stylefeng.guns.core.result.ResultData; -//import org.springframework.stereotype.Controller; -//import org.springframework.web.bind.annotation.RequestMapping; -//import org.springframework.web.bind.annotation.ResponseBody; -//import org.springframework.web.bind.annotation.PathVariable; -//import org.springframework.beans.factory.annotation.Autowired; -//import com.casic.missiles.core.page.PageFactory; -//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -//import java.util.List; -//import com.stylefeng.guns.core.common.constant.factory.PageFactory; -//import org.springframework.web.bind.annotation.RequestParam; -//import com.stylefeng.guns.modular.system.model.BusPlan; -//import com.stylefeng.guns.modular.system.service.IBusPlanService; -// -///** -// * 任务计划控制器 -// * -// * @author dev -// * @Date 2023-04-18 15:44:40 -// */ -//@Controller -//@RequestMapping("/busPlan") -//public class BusPlanController extends ExportController { -// -// -// @Autowired -// private IBusPlanService busPlanService; -// -// +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.model.BusPlan; +import com.casic.missiles.modular.system.service.IBusPlanService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.validation.Valid; +import java.util.Objects; + +/** + * 任务计划控制器 + * + * @author dev + * @Date 2023-04-18 15:44:40 + */ +@Controller +@RequestMapping("/task") +public class BusPlanController extends ExportController { + + + @Autowired + private IBusPlanService busPlanService; + + + /** + * 获取任务计划列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String condition) { + return busPlanService.list(null); + } + + /** + * 获取任务计划分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = new QueryWrapper<>(); + page = busPlanService.page(page, query); + return super.packForBT(page); + } + + /** + * 新增任务计划 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusPlan busPlan) { + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("新增失败"); + + } + + /** + * 删除任务计划 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); + } + // /** -// * 获取任务计划列表 -// */ -// @RequestMapping(value = "/list") -// @ResponseBody -// public Object list(String condition) { -// return busPlanService.selectList(null); -// } -// -// /** -// * 获取任务计划分页列表 -// */ -// @RequestMapping(value = "/listPage") -// @ResponseBody -// public Object listPage(String condition) { -// Page page = new PageFactory().defaultPage(); -// EntityWrapper query = new EntityWrapper<>(); -// page = busPlanService.selectPage(page,query); -// return super.packForBT(page); -// } -// /** -// * 新增任务计划 -// */ -// @RequestMapping(value = "/add") -// @ResponseBody -// public Object add(BusPlan busPlan) { -// busPlanService.insert(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 删除任务计划 +// * 任务启用或停止 // */ // @RequestMapping(value = "/delete") // @ResponseBody -// public Object delete(@RequestParam String busPlanId) { -// busPlanService.deleteById(busPlanId); -// return SUCCESS_TIP; +// public Object delete(@RequestBody @Valid IdDTO idDTO) { +// Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); +// return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); // } -// -// /** -// * 批量删除 -// */ -// @RequestMapping(value = "/batchDelete") -// @ResponseBody -// public Object delete(@RequestParam("busPlanIds") List busPlanIds) { -// busPlanService.deleteBatchIds(busPlanIds); -// return SUCCESS_TIP; -// } -// -// /** -// * 修改任务计划 -// */ -// @RequestMapping(value = "/update") -// @ResponseBody -// public Object update(BusPlan busPlan) { -// busPlanService.updateById(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 任务计划详情 -// */ -// @RequestMapping(value = "/detail/{busPlanId}") -// @ResponseBody -// public Object detail(@PathVariable("busPlanId") String busPlanId) { -// ResultData resultData = new ResultData(); -// resultData.setCode(200); -// resultData.setMessage("查询详情成功"); -// resultData.setData(busPlanService.selectById(busPlanId)); -// return resultData; -// } -//} + + + /** + * 修改任务计划 + */ + @RequestMapping(value = "/edit") + @ResponseBody + public Object edit(@RequestBody @Valid BusPlan busPlan) { + Assert.isFalse(Objects.isNull(busPlan.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("更新失败"); + } + +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java new file mode 100644 index 0000000..fc97688 --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StartTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StartTaskJob.class); + + private String jobId; + + + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(String id) { + //toDo:开启巡航 + + System.out.println("开始执行了------"); + } +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java new file mode 100644 index 0000000..0cd49ec --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java @@ -0,0 +1,42 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StopTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StopTaskJob.class); + + private Integer jobId; + + + + public void setJobId(Integer jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(Integer id) { + + //toDo:关闭巡航 + + System.out.println("停止执行了------"); + } +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java b/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java index 0f648dd..aed7813 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java @@ -13,4 +13,6 @@ */ public interface IBusPlanService extends IService { + boolean saveOrUpdateBusPlan(BusPlan busPlan); + } diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java b/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java index 1df7e2e..a46b298 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java @@ -1,11 +1,22 @@ package com.casic.missiles.modular.system.service.impl; -import com.casic.missiles.modular.system.model.BusPlan; -import com.casic.missiles.modular.system.dao.BusPlanMapper; -import com.casic.missiles.modular.system.service.IBusPlanService; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.enums.StatusEnum; +import com.casic.missiles.modular.system.dao.BusPlanMapper; +import com.casic.missiles.modular.system.job.StartTaskJob; +import com.casic.missiles.modular.system.job.StopTaskJob; +import com.casic.missiles.modular.system.model.BusPlan; +import com.casic.missiles.modular.system.service.IBusPlanService; +import com.casic.missiles.quartz.service.IQuartzManager; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + /** *

* 任务计划表 服务实现类 @@ -17,4 +28,34 @@ @Service public class BusPlanServiceImpl extends ServiceImpl implements IBusPlanService { + @Autowired + private IQuartzManager quartzManager; + + @Override + public boolean saveOrUpdateBusPlan(BusPlan busPlan) { + //先保存数据 + if (this.saveOrUpdate(busPlan)) { + //若已启动任务,则创建启动job任务 + if (StatusEnum.STATUS_OPEN.equals(busPlan.getStatus())) { + //到时间开启 + if (ObjectUtil.isNotEmpty(busPlan.getBeginDate()) && ObjectUtil.isNotEmpty(busPlan.getBeginTime())) { + Date startTaskTime = DateUtil.parseDateTime(busPlan.getBeginDate()+" "+busPlan.getBeginTime()); + String jobName = "startPatrolTask" + busPlan.getId(); + Map map = new HashMap<>(); + map.put("jobId", busPlan.getId()); + quartzManager.addJob(jobName, StartTaskJob.class, startTaskTime, map); + } + //到时间关闭 + if (ObjectUtil.isNotEmpty(busPlan.getEndDate()) && ObjectUtil.isNotEmpty(busPlan.getEndTime())) { + Date endTaskTime = DateUtil.parseDateTime(busPlan.getEndDate()+" "+busPlan.getEndTime()); + String jobName = "endPatrolTask" + busPlan.getId(); + Map map = new HashMap<>(); + map.put("jobId", busPlan.getId()); + quartzManager.addJob(jobName, StopTaskJob.class, endTaskTime, map); + } + } + return true; + } + return false; + } } diff --git a/casic-quartz/pom.xml b/casic-quartz/pom.xml new file mode 100644 index 0000000..1874a17 --- /dev/null +++ b/casic-quartz/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + + com.casic + casic-PTZ + 2.0.0 + ../pom.xml + + + casic-quartz + 2.0.0 + jar + + + + org.springframework.boot + spring-boot-starter-aop + + + org.quartz-scheduler + quartz + 2.3.0 + + + com.mchange + c3p0 + 0.9.5.2 + + + org.springframework + spring-context-support + 5.0.5.RELEASE + + + + \ No newline at end of file diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/StartupRunner.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/StartupRunner.java new file mode 100644 index 0000000..467ef55 --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/StartupRunner.java @@ -0,0 +1,20 @@ +package com.casic.missiles.quartz; + +import com.casic.missiles.quartz.service.IQuartzManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +public class StartupRunner implements CommandLineRunner { + + @Autowired + public IQuartzManager quartzManager; + + @Override + public void run(String... args) { + + quartzManager.resumeJob(); + System.out.println(">>>>>>>>>>>>>>>加载定时任务<<<<<<<<<<<<<"); + } +} \ No newline at end of file diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/config/JobFactory.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/JobFactory.java new file mode 100644 index 0000000..28c91fe --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/JobFactory.java @@ -0,0 +1,33 @@ +package com.casic.missiles.quartz.config; + +import org.quartz.spi.TriggerFiredBundle; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.scheduling.quartz.AdaptableJobFactory; +import org.springframework.stereotype.Component; + + +public class JobFactory extends AdaptableJobFactory { + /** + * AutowireCapableBeanFactory接口是BeanFactory的子类 + * 可以连接和填充那些生命周期不被Spring管理的已存在的bean实例 + */ + private AutowireCapableBeanFactory factory; + + public JobFactory(AutowireCapableBeanFactory factory) { + this.factory = factory; + } + + /** + * 创建Job实例 + */ + @Override + protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { + + // 实例化对象 + Object job = super.createJobInstance(bundle); + // 进行注入(Spring管理该Bean) + factory.autowireBean(job); + //返回对象 + return job; + } +} diff --git a/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java new file mode 100644 index 0000000..c9068b7 --- /dev/null +++ b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface StatusEnum { + //任务开启 + String STATUS_OPEN = "1"; + //任务关闭 + String STATUS_CLOSE = "0"; + + +} diff --git a/casic-data/pom.xml b/casic-data/pom.xml index 7b9d140..aca0a62 100644 --- a/casic-data/pom.xml +++ b/casic-data/pom.xml @@ -52,6 +52,13 @@ 2.0.0 compile + + com.casic + casic-quartz + 2.0.0 + compile + + diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java index 78b93e8..cbb235e 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java @@ -1,105 +1,106 @@ -//package com.casic.missiles.modular.system.controller; -// -//import com.casic.missiles.core.base.controller.ExportController; -//import com.stylefeng.guns.core.result.ResultData; -//import org.springframework.stereotype.Controller; -//import org.springframework.web.bind.annotation.RequestMapping; -//import org.springframework.web.bind.annotation.ResponseBody; -//import org.springframework.web.bind.annotation.PathVariable; -//import org.springframework.beans.factory.annotation.Autowired; -//import com.casic.missiles.core.page.PageFactory; -//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -//import java.util.List; -//import com.stylefeng.guns.core.common.constant.factory.PageFactory; -//import org.springframework.web.bind.annotation.RequestParam; -//import com.stylefeng.guns.modular.system.model.BusPlan; -//import com.stylefeng.guns.modular.system.service.IBusPlanService; -// -///** -// * 任务计划控制器 -// * -// * @author dev -// * @Date 2023-04-18 15:44:40 -// */ -//@Controller -//@RequestMapping("/busPlan") -//public class BusPlanController extends ExportController { -// -// -// @Autowired -// private IBusPlanService busPlanService; -// -// +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.model.BusPlan; +import com.casic.missiles.modular.system.service.IBusPlanService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.validation.Valid; +import java.util.Objects; + +/** + * 任务计划控制器 + * + * @author dev + * @Date 2023-04-18 15:44:40 + */ +@Controller +@RequestMapping("/task") +public class BusPlanController extends ExportController { + + + @Autowired + private IBusPlanService busPlanService; + + + /** + * 获取任务计划列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String condition) { + return busPlanService.list(null); + } + + /** + * 获取任务计划分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = new QueryWrapper<>(); + page = busPlanService.page(page, query); + return super.packForBT(page); + } + + /** + * 新增任务计划 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusPlan busPlan) { + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("新增失败"); + + } + + /** + * 删除任务计划 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); + } + // /** -// * 获取任务计划列表 -// */ -// @RequestMapping(value = "/list") -// @ResponseBody -// public Object list(String condition) { -// return busPlanService.selectList(null); -// } -// -// /** -// * 获取任务计划分页列表 -// */ -// @RequestMapping(value = "/listPage") -// @ResponseBody -// public Object listPage(String condition) { -// Page page = new PageFactory().defaultPage(); -// EntityWrapper query = new EntityWrapper<>(); -// page = busPlanService.selectPage(page,query); -// return super.packForBT(page); -// } -// /** -// * 新增任务计划 -// */ -// @RequestMapping(value = "/add") -// @ResponseBody -// public Object add(BusPlan busPlan) { -// busPlanService.insert(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 删除任务计划 +// * 任务启用或停止 // */ // @RequestMapping(value = "/delete") // @ResponseBody -// public Object delete(@RequestParam String busPlanId) { -// busPlanService.deleteById(busPlanId); -// return SUCCESS_TIP; +// public Object delete(@RequestBody @Valid IdDTO idDTO) { +// Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); +// return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); // } -// -// /** -// * 批量删除 -// */ -// @RequestMapping(value = "/batchDelete") -// @ResponseBody -// public Object delete(@RequestParam("busPlanIds") List busPlanIds) { -// busPlanService.deleteBatchIds(busPlanIds); -// return SUCCESS_TIP; -// } -// -// /** -// * 修改任务计划 -// */ -// @RequestMapping(value = "/update") -// @ResponseBody -// public Object update(BusPlan busPlan) { -// busPlanService.updateById(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 任务计划详情 -// */ -// @RequestMapping(value = "/detail/{busPlanId}") -// @ResponseBody -// public Object detail(@PathVariable("busPlanId") String busPlanId) { -// ResultData resultData = new ResultData(); -// resultData.setCode(200); -// resultData.setMessage("查询详情成功"); -// resultData.setData(busPlanService.selectById(busPlanId)); -// return resultData; -// } -//} + + + /** + * 修改任务计划 + */ + @RequestMapping(value = "/edit") + @ResponseBody + public Object edit(@RequestBody @Valid BusPlan busPlan) { + Assert.isFalse(Objects.isNull(busPlan.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("更新失败"); + } + +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java new file mode 100644 index 0000000..fc97688 --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StartTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StartTaskJob.class); + + private String jobId; + + + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(String id) { + //toDo:开启巡航 + + System.out.println("开始执行了------"); + } +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java new file mode 100644 index 0000000..0cd49ec --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java @@ -0,0 +1,42 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StopTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StopTaskJob.class); + + private Integer jobId; + + + + public void setJobId(Integer jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(Integer id) { + + //toDo:关闭巡航 + + System.out.println("停止执行了------"); + } +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java b/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java index 0f648dd..aed7813 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java @@ -13,4 +13,6 @@ */ public interface IBusPlanService extends IService { + boolean saveOrUpdateBusPlan(BusPlan busPlan); + } diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java b/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java index 1df7e2e..a46b298 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java @@ -1,11 +1,22 @@ package com.casic.missiles.modular.system.service.impl; -import com.casic.missiles.modular.system.model.BusPlan; -import com.casic.missiles.modular.system.dao.BusPlanMapper; -import com.casic.missiles.modular.system.service.IBusPlanService; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.enums.StatusEnum; +import com.casic.missiles.modular.system.dao.BusPlanMapper; +import com.casic.missiles.modular.system.job.StartTaskJob; +import com.casic.missiles.modular.system.job.StopTaskJob; +import com.casic.missiles.modular.system.model.BusPlan; +import com.casic.missiles.modular.system.service.IBusPlanService; +import com.casic.missiles.quartz.service.IQuartzManager; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + /** *

* 任务计划表 服务实现类 @@ -17,4 +28,34 @@ @Service public class BusPlanServiceImpl extends ServiceImpl implements IBusPlanService { + @Autowired + private IQuartzManager quartzManager; + + @Override + public boolean saveOrUpdateBusPlan(BusPlan busPlan) { + //先保存数据 + if (this.saveOrUpdate(busPlan)) { + //若已启动任务,则创建启动job任务 + if (StatusEnum.STATUS_OPEN.equals(busPlan.getStatus())) { + //到时间开启 + if (ObjectUtil.isNotEmpty(busPlan.getBeginDate()) && ObjectUtil.isNotEmpty(busPlan.getBeginTime())) { + Date startTaskTime = DateUtil.parseDateTime(busPlan.getBeginDate()+" "+busPlan.getBeginTime()); + String jobName = "startPatrolTask" + busPlan.getId(); + Map map = new HashMap<>(); + map.put("jobId", busPlan.getId()); + quartzManager.addJob(jobName, StartTaskJob.class, startTaskTime, map); + } + //到时间关闭 + if (ObjectUtil.isNotEmpty(busPlan.getEndDate()) && ObjectUtil.isNotEmpty(busPlan.getEndTime())) { + Date endTaskTime = DateUtil.parseDateTime(busPlan.getEndDate()+" "+busPlan.getEndTime()); + String jobName = "endPatrolTask" + busPlan.getId(); + Map map = new HashMap<>(); + map.put("jobId", busPlan.getId()); + quartzManager.addJob(jobName, StopTaskJob.class, endTaskTime, map); + } + } + return true; + } + return false; + } } diff --git a/casic-quartz/pom.xml b/casic-quartz/pom.xml new file mode 100644 index 0000000..1874a17 --- /dev/null +++ b/casic-quartz/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + + com.casic + casic-PTZ + 2.0.0 + ../pom.xml + + + casic-quartz + 2.0.0 + jar + + + + org.springframework.boot + spring-boot-starter-aop + + + org.quartz-scheduler + quartz + 2.3.0 + + + com.mchange + c3p0 + 0.9.5.2 + + + org.springframework + spring-context-support + 5.0.5.RELEASE + + + + \ No newline at end of file diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/StartupRunner.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/StartupRunner.java new file mode 100644 index 0000000..467ef55 --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/StartupRunner.java @@ -0,0 +1,20 @@ +package com.casic.missiles.quartz; + +import com.casic.missiles.quartz.service.IQuartzManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +public class StartupRunner implements CommandLineRunner { + + @Autowired + public IQuartzManager quartzManager; + + @Override + public void run(String... args) { + + quartzManager.resumeJob(); + System.out.println(">>>>>>>>>>>>>>>加载定时任务<<<<<<<<<<<<<"); + } +} \ No newline at end of file diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/config/JobFactory.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/JobFactory.java new file mode 100644 index 0000000..28c91fe --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/JobFactory.java @@ -0,0 +1,33 @@ +package com.casic.missiles.quartz.config; + +import org.quartz.spi.TriggerFiredBundle; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.scheduling.quartz.AdaptableJobFactory; +import org.springframework.stereotype.Component; + + +public class JobFactory extends AdaptableJobFactory { + /** + * AutowireCapableBeanFactory接口是BeanFactory的子类 + * 可以连接和填充那些生命周期不被Spring管理的已存在的bean实例 + */ + private AutowireCapableBeanFactory factory; + + public JobFactory(AutowireCapableBeanFactory factory) { + this.factory = factory; + } + + /** + * 创建Job实例 + */ + @Override + protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { + + // 实例化对象 + Object job = super.createJobInstance(bundle); + // 进行注入(Spring管理该Bean) + factory.autowireBean(job); + //返回对象 + return job; + } +} diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/config/QuartzConfig.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/QuartzConfig.java new file mode 100644 index 0000000..adec34e --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/QuartzConfig.java @@ -0,0 +1,54 @@ +package com.casic.missiles.quartz.config; + +import org.quartz.Scheduler; +import org.quartz.spi.JobFactory; +import org.quartz.spi.TriggerFiredBundle; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; +import org.springframework.scheduling.quartz.AdaptableJobFactory; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; + +@Configuration +public class QuartzConfig { + @Autowired + private JobFactory jobFactory; + + @Autowired + private AutowireCapableBeanFactory capableBeanFactory; + + /** + * 当触发器触发时,与之关联的任务被Scheduler中配置的JobFactory实例化,也就是每触发一次,就会创建一个任务的实例化对象 + * (如果缺省)则调用Job类的newInstance方法生成一个实例 + * (这里选择自定义)并将创建的Job实例化交给IoC管理 + * @return + */ + @Bean + public JobFactory jobFactory() { + return new AdaptableJobFactory() { + @Override + protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { + Object jobInstance = super.createJobInstance(bundle); + capableBeanFactory.autowireBean(jobInstance); + return jobInstance; + } + }; + } + + @Bean + public SchedulerFactoryBean schedulerFactoryBean() { + SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); + schedulerFactoryBean.setJobFactory(jobFactory); + //延迟启动 + schedulerFactoryBean.setStartupDelay(1); + schedulerFactoryBean.setConfigLocation(new ClassPathResource("/quartz.properties")); + return schedulerFactoryBean; + } + + @Bean + public Scheduler scheduler() { + return schedulerFactoryBean().getScheduler(); + } +} \ No newline at end of file diff --git a/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java new file mode 100644 index 0000000..c9068b7 --- /dev/null +++ b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface StatusEnum { + //任务开启 + String STATUS_OPEN = "1"; + //任务关闭 + String STATUS_CLOSE = "0"; + + +} diff --git a/casic-data/pom.xml b/casic-data/pom.xml index 7b9d140..aca0a62 100644 --- a/casic-data/pom.xml +++ b/casic-data/pom.xml @@ -52,6 +52,13 @@ 2.0.0 compile + + com.casic + casic-quartz + 2.0.0 + compile + + diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java index 78b93e8..cbb235e 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java @@ -1,105 +1,106 @@ -//package com.casic.missiles.modular.system.controller; -// -//import com.casic.missiles.core.base.controller.ExportController; -//import com.stylefeng.guns.core.result.ResultData; -//import org.springframework.stereotype.Controller; -//import org.springframework.web.bind.annotation.RequestMapping; -//import org.springframework.web.bind.annotation.ResponseBody; -//import org.springframework.web.bind.annotation.PathVariable; -//import org.springframework.beans.factory.annotation.Autowired; -//import com.casic.missiles.core.page.PageFactory; -//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -//import java.util.List; -//import com.stylefeng.guns.core.common.constant.factory.PageFactory; -//import org.springframework.web.bind.annotation.RequestParam; -//import com.stylefeng.guns.modular.system.model.BusPlan; -//import com.stylefeng.guns.modular.system.service.IBusPlanService; -// -///** -// * 任务计划控制器 -// * -// * @author dev -// * @Date 2023-04-18 15:44:40 -// */ -//@Controller -//@RequestMapping("/busPlan") -//public class BusPlanController extends ExportController { -// -// -// @Autowired -// private IBusPlanService busPlanService; -// -// +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.model.BusPlan; +import com.casic.missiles.modular.system.service.IBusPlanService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.validation.Valid; +import java.util.Objects; + +/** + * 任务计划控制器 + * + * @author dev + * @Date 2023-04-18 15:44:40 + */ +@Controller +@RequestMapping("/task") +public class BusPlanController extends ExportController { + + + @Autowired + private IBusPlanService busPlanService; + + + /** + * 获取任务计划列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String condition) { + return busPlanService.list(null); + } + + /** + * 获取任务计划分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = new QueryWrapper<>(); + page = busPlanService.page(page, query); + return super.packForBT(page); + } + + /** + * 新增任务计划 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusPlan busPlan) { + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("新增失败"); + + } + + /** + * 删除任务计划 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); + } + // /** -// * 获取任务计划列表 -// */ -// @RequestMapping(value = "/list") -// @ResponseBody -// public Object list(String condition) { -// return busPlanService.selectList(null); -// } -// -// /** -// * 获取任务计划分页列表 -// */ -// @RequestMapping(value = "/listPage") -// @ResponseBody -// public Object listPage(String condition) { -// Page page = new PageFactory().defaultPage(); -// EntityWrapper query = new EntityWrapper<>(); -// page = busPlanService.selectPage(page,query); -// return super.packForBT(page); -// } -// /** -// * 新增任务计划 -// */ -// @RequestMapping(value = "/add") -// @ResponseBody -// public Object add(BusPlan busPlan) { -// busPlanService.insert(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 删除任务计划 +// * 任务启用或停止 // */ // @RequestMapping(value = "/delete") // @ResponseBody -// public Object delete(@RequestParam String busPlanId) { -// busPlanService.deleteById(busPlanId); -// return SUCCESS_TIP; +// public Object delete(@RequestBody @Valid IdDTO idDTO) { +// Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); +// return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); // } -// -// /** -// * 批量删除 -// */ -// @RequestMapping(value = "/batchDelete") -// @ResponseBody -// public Object delete(@RequestParam("busPlanIds") List busPlanIds) { -// busPlanService.deleteBatchIds(busPlanIds); -// return SUCCESS_TIP; -// } -// -// /** -// * 修改任务计划 -// */ -// @RequestMapping(value = "/update") -// @ResponseBody -// public Object update(BusPlan busPlan) { -// busPlanService.updateById(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 任务计划详情 -// */ -// @RequestMapping(value = "/detail/{busPlanId}") -// @ResponseBody -// public Object detail(@PathVariable("busPlanId") String busPlanId) { -// ResultData resultData = new ResultData(); -// resultData.setCode(200); -// resultData.setMessage("查询详情成功"); -// resultData.setData(busPlanService.selectById(busPlanId)); -// return resultData; -// } -//} + + + /** + * 修改任务计划 + */ + @RequestMapping(value = "/edit") + @ResponseBody + public Object edit(@RequestBody @Valid BusPlan busPlan) { + Assert.isFalse(Objects.isNull(busPlan.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("更新失败"); + } + +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java new file mode 100644 index 0000000..fc97688 --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StartTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StartTaskJob.class); + + private String jobId; + + + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(String id) { + //toDo:开启巡航 + + System.out.println("开始执行了------"); + } +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java new file mode 100644 index 0000000..0cd49ec --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java @@ -0,0 +1,42 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StopTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StopTaskJob.class); + + private Integer jobId; + + + + public void setJobId(Integer jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(Integer id) { + + //toDo:关闭巡航 + + System.out.println("停止执行了------"); + } +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java b/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java index 0f648dd..aed7813 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java @@ -13,4 +13,6 @@ */ public interface IBusPlanService extends IService { + boolean saveOrUpdateBusPlan(BusPlan busPlan); + } diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java b/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java index 1df7e2e..a46b298 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java @@ -1,11 +1,22 @@ package com.casic.missiles.modular.system.service.impl; -import com.casic.missiles.modular.system.model.BusPlan; -import com.casic.missiles.modular.system.dao.BusPlanMapper; -import com.casic.missiles.modular.system.service.IBusPlanService; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.enums.StatusEnum; +import com.casic.missiles.modular.system.dao.BusPlanMapper; +import com.casic.missiles.modular.system.job.StartTaskJob; +import com.casic.missiles.modular.system.job.StopTaskJob; +import com.casic.missiles.modular.system.model.BusPlan; +import com.casic.missiles.modular.system.service.IBusPlanService; +import com.casic.missiles.quartz.service.IQuartzManager; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + /** *

* 任务计划表 服务实现类 @@ -17,4 +28,34 @@ @Service public class BusPlanServiceImpl extends ServiceImpl implements IBusPlanService { + @Autowired + private IQuartzManager quartzManager; + + @Override + public boolean saveOrUpdateBusPlan(BusPlan busPlan) { + //先保存数据 + if (this.saveOrUpdate(busPlan)) { + //若已启动任务,则创建启动job任务 + if (StatusEnum.STATUS_OPEN.equals(busPlan.getStatus())) { + //到时间开启 + if (ObjectUtil.isNotEmpty(busPlan.getBeginDate()) && ObjectUtil.isNotEmpty(busPlan.getBeginTime())) { + Date startTaskTime = DateUtil.parseDateTime(busPlan.getBeginDate()+" "+busPlan.getBeginTime()); + String jobName = "startPatrolTask" + busPlan.getId(); + Map map = new HashMap<>(); + map.put("jobId", busPlan.getId()); + quartzManager.addJob(jobName, StartTaskJob.class, startTaskTime, map); + } + //到时间关闭 + if (ObjectUtil.isNotEmpty(busPlan.getEndDate()) && ObjectUtil.isNotEmpty(busPlan.getEndTime())) { + Date endTaskTime = DateUtil.parseDateTime(busPlan.getEndDate()+" "+busPlan.getEndTime()); + String jobName = "endPatrolTask" + busPlan.getId(); + Map map = new HashMap<>(); + map.put("jobId", busPlan.getId()); + quartzManager.addJob(jobName, StopTaskJob.class, endTaskTime, map); + } + } + return true; + } + return false; + } } diff --git a/casic-quartz/pom.xml b/casic-quartz/pom.xml new file mode 100644 index 0000000..1874a17 --- /dev/null +++ b/casic-quartz/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + + com.casic + casic-PTZ + 2.0.0 + ../pom.xml + + + casic-quartz + 2.0.0 + jar + + + + org.springframework.boot + spring-boot-starter-aop + + + org.quartz-scheduler + quartz + 2.3.0 + + + com.mchange + c3p0 + 0.9.5.2 + + + org.springframework + spring-context-support + 5.0.5.RELEASE + + + + \ No newline at end of file diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/StartupRunner.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/StartupRunner.java new file mode 100644 index 0000000..467ef55 --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/StartupRunner.java @@ -0,0 +1,20 @@ +package com.casic.missiles.quartz; + +import com.casic.missiles.quartz.service.IQuartzManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +public class StartupRunner implements CommandLineRunner { + + @Autowired + public IQuartzManager quartzManager; + + @Override + public void run(String... args) { + + quartzManager.resumeJob(); + System.out.println(">>>>>>>>>>>>>>>加载定时任务<<<<<<<<<<<<<"); + } +} \ No newline at end of file diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/config/JobFactory.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/JobFactory.java new file mode 100644 index 0000000..28c91fe --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/JobFactory.java @@ -0,0 +1,33 @@ +package com.casic.missiles.quartz.config; + +import org.quartz.spi.TriggerFiredBundle; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.scheduling.quartz.AdaptableJobFactory; +import org.springframework.stereotype.Component; + + +public class JobFactory extends AdaptableJobFactory { + /** + * AutowireCapableBeanFactory接口是BeanFactory的子类 + * 可以连接和填充那些生命周期不被Spring管理的已存在的bean实例 + */ + private AutowireCapableBeanFactory factory; + + public JobFactory(AutowireCapableBeanFactory factory) { + this.factory = factory; + } + + /** + * 创建Job实例 + */ + @Override + protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { + + // 实例化对象 + Object job = super.createJobInstance(bundle); + // 进行注入(Spring管理该Bean) + factory.autowireBean(job); + //返回对象 + return job; + } +} diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/config/QuartzConfig.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/QuartzConfig.java new file mode 100644 index 0000000..adec34e --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/QuartzConfig.java @@ -0,0 +1,54 @@ +package com.casic.missiles.quartz.config; + +import org.quartz.Scheduler; +import org.quartz.spi.JobFactory; +import org.quartz.spi.TriggerFiredBundle; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; +import org.springframework.scheduling.quartz.AdaptableJobFactory; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; + +@Configuration +public class QuartzConfig { + @Autowired + private JobFactory jobFactory; + + @Autowired + private AutowireCapableBeanFactory capableBeanFactory; + + /** + * 当触发器触发时,与之关联的任务被Scheduler中配置的JobFactory实例化,也就是每触发一次,就会创建一个任务的实例化对象 + * (如果缺省)则调用Job类的newInstance方法生成一个实例 + * (这里选择自定义)并将创建的Job实例化交给IoC管理 + * @return + */ + @Bean + public JobFactory jobFactory() { + return new AdaptableJobFactory() { + @Override + protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { + Object jobInstance = super.createJobInstance(bundle); + capableBeanFactory.autowireBean(jobInstance); + return jobInstance; + } + }; + } + + @Bean + public SchedulerFactoryBean schedulerFactoryBean() { + SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); + schedulerFactoryBean.setJobFactory(jobFactory); + //延迟启动 + schedulerFactoryBean.setStartupDelay(1); + schedulerFactoryBean.setConfigLocation(new ClassPathResource("/quartz.properties")); + return schedulerFactoryBean; + } + + @Bean + public Scheduler scheduler() { + return schedulerFactoryBean().getScheduler(); + } +} \ No newline at end of file diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/job/MyJob.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/job/MyJob.java new file mode 100644 index 0000000..947aadc --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/job/MyJob.java @@ -0,0 +1,27 @@ +package com.casic.missiles.quartz.job; + +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +import java.text.SimpleDateFormat; +import java.util.Date; + +//例子 +public class MyJob implements Job { + + private String name; + + public void setName(String name) { + this.name = name; + } + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + + System.out.println("CRON ----> schedule job1 is running ... + " + name + " ----> " + dateFormat.format(new Date())); + } +} \ No newline at end of file diff --git a/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java new file mode 100644 index 0000000..c9068b7 --- /dev/null +++ b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface StatusEnum { + //任务开启 + String STATUS_OPEN = "1"; + //任务关闭 + String STATUS_CLOSE = "0"; + + +} diff --git a/casic-data/pom.xml b/casic-data/pom.xml index 7b9d140..aca0a62 100644 --- a/casic-data/pom.xml +++ b/casic-data/pom.xml @@ -52,6 +52,13 @@ 2.0.0 compile + + com.casic + casic-quartz + 2.0.0 + compile + + diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java index 78b93e8..cbb235e 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java @@ -1,105 +1,106 @@ -//package com.casic.missiles.modular.system.controller; -// -//import com.casic.missiles.core.base.controller.ExportController; -//import com.stylefeng.guns.core.result.ResultData; -//import org.springframework.stereotype.Controller; -//import org.springframework.web.bind.annotation.RequestMapping; -//import org.springframework.web.bind.annotation.ResponseBody; -//import org.springframework.web.bind.annotation.PathVariable; -//import org.springframework.beans.factory.annotation.Autowired; -//import com.casic.missiles.core.page.PageFactory; -//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -//import java.util.List; -//import com.stylefeng.guns.core.common.constant.factory.PageFactory; -//import org.springframework.web.bind.annotation.RequestParam; -//import com.stylefeng.guns.modular.system.model.BusPlan; -//import com.stylefeng.guns.modular.system.service.IBusPlanService; -// -///** -// * 任务计划控制器 -// * -// * @author dev -// * @Date 2023-04-18 15:44:40 -// */ -//@Controller -//@RequestMapping("/busPlan") -//public class BusPlanController extends ExportController { -// -// -// @Autowired -// private IBusPlanService busPlanService; -// -// +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.model.BusPlan; +import com.casic.missiles.modular.system.service.IBusPlanService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.validation.Valid; +import java.util.Objects; + +/** + * 任务计划控制器 + * + * @author dev + * @Date 2023-04-18 15:44:40 + */ +@Controller +@RequestMapping("/task") +public class BusPlanController extends ExportController { + + + @Autowired + private IBusPlanService busPlanService; + + + /** + * 获取任务计划列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String condition) { + return busPlanService.list(null); + } + + /** + * 获取任务计划分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = new QueryWrapper<>(); + page = busPlanService.page(page, query); + return super.packForBT(page); + } + + /** + * 新增任务计划 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusPlan busPlan) { + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("新增失败"); + + } + + /** + * 删除任务计划 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); + } + // /** -// * 获取任务计划列表 -// */ -// @RequestMapping(value = "/list") -// @ResponseBody -// public Object list(String condition) { -// return busPlanService.selectList(null); -// } -// -// /** -// * 获取任务计划分页列表 -// */ -// @RequestMapping(value = "/listPage") -// @ResponseBody -// public Object listPage(String condition) { -// Page page = new PageFactory().defaultPage(); -// EntityWrapper query = new EntityWrapper<>(); -// page = busPlanService.selectPage(page,query); -// return super.packForBT(page); -// } -// /** -// * 新增任务计划 -// */ -// @RequestMapping(value = "/add") -// @ResponseBody -// public Object add(BusPlan busPlan) { -// busPlanService.insert(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 删除任务计划 +// * 任务启用或停止 // */ // @RequestMapping(value = "/delete") // @ResponseBody -// public Object delete(@RequestParam String busPlanId) { -// busPlanService.deleteById(busPlanId); -// return SUCCESS_TIP; +// public Object delete(@RequestBody @Valid IdDTO idDTO) { +// Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); +// return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); // } -// -// /** -// * 批量删除 -// */ -// @RequestMapping(value = "/batchDelete") -// @ResponseBody -// public Object delete(@RequestParam("busPlanIds") List busPlanIds) { -// busPlanService.deleteBatchIds(busPlanIds); -// return SUCCESS_TIP; -// } -// -// /** -// * 修改任务计划 -// */ -// @RequestMapping(value = "/update") -// @ResponseBody -// public Object update(BusPlan busPlan) { -// busPlanService.updateById(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 任务计划详情 -// */ -// @RequestMapping(value = "/detail/{busPlanId}") -// @ResponseBody -// public Object detail(@PathVariable("busPlanId") String busPlanId) { -// ResultData resultData = new ResultData(); -// resultData.setCode(200); -// resultData.setMessage("查询详情成功"); -// resultData.setData(busPlanService.selectById(busPlanId)); -// return resultData; -// } -//} + + + /** + * 修改任务计划 + */ + @RequestMapping(value = "/edit") + @ResponseBody + public Object edit(@RequestBody @Valid BusPlan busPlan) { + Assert.isFalse(Objects.isNull(busPlan.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("更新失败"); + } + +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java new file mode 100644 index 0000000..fc97688 --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StartTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StartTaskJob.class); + + private String jobId; + + + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(String id) { + //toDo:开启巡航 + + System.out.println("开始执行了------"); + } +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java new file mode 100644 index 0000000..0cd49ec --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java @@ -0,0 +1,42 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StopTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StopTaskJob.class); + + private Integer jobId; + + + + public void setJobId(Integer jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(Integer id) { + + //toDo:关闭巡航 + + System.out.println("停止执行了------"); + } +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java b/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java index 0f648dd..aed7813 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java @@ -13,4 +13,6 @@ */ public interface IBusPlanService extends IService { + boolean saveOrUpdateBusPlan(BusPlan busPlan); + } diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java b/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java index 1df7e2e..a46b298 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java @@ -1,11 +1,22 @@ package com.casic.missiles.modular.system.service.impl; -import com.casic.missiles.modular.system.model.BusPlan; -import com.casic.missiles.modular.system.dao.BusPlanMapper; -import com.casic.missiles.modular.system.service.IBusPlanService; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.enums.StatusEnum; +import com.casic.missiles.modular.system.dao.BusPlanMapper; +import com.casic.missiles.modular.system.job.StartTaskJob; +import com.casic.missiles.modular.system.job.StopTaskJob; +import com.casic.missiles.modular.system.model.BusPlan; +import com.casic.missiles.modular.system.service.IBusPlanService; +import com.casic.missiles.quartz.service.IQuartzManager; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + /** *

* 任务计划表 服务实现类 @@ -17,4 +28,34 @@ @Service public class BusPlanServiceImpl extends ServiceImpl implements IBusPlanService { + @Autowired + private IQuartzManager quartzManager; + + @Override + public boolean saveOrUpdateBusPlan(BusPlan busPlan) { + //先保存数据 + if (this.saveOrUpdate(busPlan)) { + //若已启动任务,则创建启动job任务 + if (StatusEnum.STATUS_OPEN.equals(busPlan.getStatus())) { + //到时间开启 + if (ObjectUtil.isNotEmpty(busPlan.getBeginDate()) && ObjectUtil.isNotEmpty(busPlan.getBeginTime())) { + Date startTaskTime = DateUtil.parseDateTime(busPlan.getBeginDate()+" "+busPlan.getBeginTime()); + String jobName = "startPatrolTask" + busPlan.getId(); + Map map = new HashMap<>(); + map.put("jobId", busPlan.getId()); + quartzManager.addJob(jobName, StartTaskJob.class, startTaskTime, map); + } + //到时间关闭 + if (ObjectUtil.isNotEmpty(busPlan.getEndDate()) && ObjectUtil.isNotEmpty(busPlan.getEndTime())) { + Date endTaskTime = DateUtil.parseDateTime(busPlan.getEndDate()+" "+busPlan.getEndTime()); + String jobName = "endPatrolTask" + busPlan.getId(); + Map map = new HashMap<>(); + map.put("jobId", busPlan.getId()); + quartzManager.addJob(jobName, StopTaskJob.class, endTaskTime, map); + } + } + return true; + } + return false; + } } diff --git a/casic-quartz/pom.xml b/casic-quartz/pom.xml new file mode 100644 index 0000000..1874a17 --- /dev/null +++ b/casic-quartz/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + + com.casic + casic-PTZ + 2.0.0 + ../pom.xml + + + casic-quartz + 2.0.0 + jar + + + + org.springframework.boot + spring-boot-starter-aop + + + org.quartz-scheduler + quartz + 2.3.0 + + + com.mchange + c3p0 + 0.9.5.2 + + + org.springframework + spring-context-support + 5.0.5.RELEASE + + + + \ No newline at end of file diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/StartupRunner.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/StartupRunner.java new file mode 100644 index 0000000..467ef55 --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/StartupRunner.java @@ -0,0 +1,20 @@ +package com.casic.missiles.quartz; + +import com.casic.missiles.quartz.service.IQuartzManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +public class StartupRunner implements CommandLineRunner { + + @Autowired + public IQuartzManager quartzManager; + + @Override + public void run(String... args) { + + quartzManager.resumeJob(); + System.out.println(">>>>>>>>>>>>>>>加载定时任务<<<<<<<<<<<<<"); + } +} \ No newline at end of file diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/config/JobFactory.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/JobFactory.java new file mode 100644 index 0000000..28c91fe --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/JobFactory.java @@ -0,0 +1,33 @@ +package com.casic.missiles.quartz.config; + +import org.quartz.spi.TriggerFiredBundle; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.scheduling.quartz.AdaptableJobFactory; +import org.springframework.stereotype.Component; + + +public class JobFactory extends AdaptableJobFactory { + /** + * AutowireCapableBeanFactory接口是BeanFactory的子类 + * 可以连接和填充那些生命周期不被Spring管理的已存在的bean实例 + */ + private AutowireCapableBeanFactory factory; + + public JobFactory(AutowireCapableBeanFactory factory) { + this.factory = factory; + } + + /** + * 创建Job实例 + */ + @Override + protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { + + // 实例化对象 + Object job = super.createJobInstance(bundle); + // 进行注入(Spring管理该Bean) + factory.autowireBean(job); + //返回对象 + return job; + } +} diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/config/QuartzConfig.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/QuartzConfig.java new file mode 100644 index 0000000..adec34e --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/QuartzConfig.java @@ -0,0 +1,54 @@ +package com.casic.missiles.quartz.config; + +import org.quartz.Scheduler; +import org.quartz.spi.JobFactory; +import org.quartz.spi.TriggerFiredBundle; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; +import org.springframework.scheduling.quartz.AdaptableJobFactory; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; + +@Configuration +public class QuartzConfig { + @Autowired + private JobFactory jobFactory; + + @Autowired + private AutowireCapableBeanFactory capableBeanFactory; + + /** + * 当触发器触发时,与之关联的任务被Scheduler中配置的JobFactory实例化,也就是每触发一次,就会创建一个任务的实例化对象 + * (如果缺省)则调用Job类的newInstance方法生成一个实例 + * (这里选择自定义)并将创建的Job实例化交给IoC管理 + * @return + */ + @Bean + public JobFactory jobFactory() { + return new AdaptableJobFactory() { + @Override + protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { + Object jobInstance = super.createJobInstance(bundle); + capableBeanFactory.autowireBean(jobInstance); + return jobInstance; + } + }; + } + + @Bean + public SchedulerFactoryBean schedulerFactoryBean() { + SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); + schedulerFactoryBean.setJobFactory(jobFactory); + //延迟启动 + schedulerFactoryBean.setStartupDelay(1); + schedulerFactoryBean.setConfigLocation(new ClassPathResource("/quartz.properties")); + return schedulerFactoryBean; + } + + @Bean + public Scheduler scheduler() { + return schedulerFactoryBean().getScheduler(); + } +} \ No newline at end of file diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/job/MyJob.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/job/MyJob.java new file mode 100644 index 0000000..947aadc --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/job/MyJob.java @@ -0,0 +1,27 @@ +package com.casic.missiles.quartz.job; + +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +import java.text.SimpleDateFormat; +import java.util.Date; + +//例子 +public class MyJob implements Job { + + private String name; + + public void setName(String name) { + this.name = name; + } + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + + System.out.println("CRON ----> schedule job1 is running ... + " + name + " ----> " + dateFormat.format(new Date())); + } +} \ No newline at end of file diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/service/IQuartzManager.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/service/IQuartzManager.java new file mode 100644 index 0000000..40a3495 --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/service/IQuartzManager.java @@ -0,0 +1,159 @@ +package com.casic.missiles.quartz.service; + +import java.util.*; + +public interface IQuartzManager { + + /** + * @param jobName 任务名 + * @param cls 任务 + * @param date 具体执行时间点 + * @Description: 延时一段时间后触发任务 + */ + void addJob(String jobName, Class cls, Date date); + + /** + * @param jobName 任务名 + * @param cls 任务 + * @param date 具体执行时间点 + * @param params 传入的参数对 + * @Description: 延时一段时间后触发任务 + */ + void addJob(String jobName, Class cls, Date date, Map params); + + + /** + * @param jobName 任务名 + * @param cls 任务 + * @param amount 延时时间,单位 秒 + * @Description: 延时一段时间后触发任务 + */ + void addJob(String jobName, Class cls, int amount); + + /** + * @param jobName 任务名 + * @param cls 任务 + * @param amount 延时时间,单位 秒 + * @param params 传入的参数对 + * @Description: 延时一段时间后触发任务 + */ + void addJob(String jobName, Class cls, int amount, Map params); + + + /** + * @param jobName 任务名 + * @param cls 任务 + * @param cron 时间设置,cron表达式 + * @Description: 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名 + */ + void addJob(String jobName, Class cls, String cron); + + /** + * @param jobName 任务名 + * @param jobGroupName 任务组名 + * @param triggerName 触发器名 + * @param triggerGroupName 触发器组名 + * @param jobClass 任务 + * @param cron 时间设置,cron表达式 + * @Description: 添加一个定时任务 + */ + void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, Class jobClass, String cron); + + /** + * @param jobName + * @param cron + * @Description: 修改一个任务的触发时间(使用默认的任务组名 , 触发器名 , 触发器组名) + */ + void modifyJobTime(String jobName, String cron); + + + /** + * @param oldJobName :原任务名 + * @param jobName + * @param jobclass + * @param cron + * @Description:修改任务,(可以修改任务名,任务类,触发时间) + */ + void modifyJob(String oldJobName, String jobName, Class jobclass, String cron); + + + /** + * @param triggerName + * @param triggerGroupName + * @param cron + * @Description: 修改一个任务的触发时间 + */ + void modifyJobTime(String triggerName, String triggerGroupName, String cron); + + + /** + * @param jobName + * @Description 移除一个任务(使用默认的任务组名 , 触发器名 , 触发器组名) + */ + void removeJob(String jobName); + + /** + * @param jobName + * @param jobGroupName + * @param triggerName + * @param triggerGroupName + * @Description: 移除一个任务 + */ + void removeJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName); + + + /** + * @param jobName + * @Description:暂停一个任务(使用默认组名) + */ + void pauseJob(String jobName); + + /** + * @param jobName + * @param jobGroupName + * @Description:暂停一个任务 + */ + void pauseJob(String jobName, String jobGroupName); + + /** + * @Description:恢复所有任务 + */ + void resumeJob(); + + /** + * @param jobName + * @Description:恢复一个任务(使用默认组名) + */ + void resumeJob(String jobName); + + /** + * @param jobName + * @param jobGroupName + * @Description:恢复一个任务 + */ + void resumeJob(String jobName, String jobGroupName); + + /** + * @Description:启动所有定时任务 + */ + void startJobs(); + + /** + * @Description 关闭所有定时任务 + */ + void shutdownJobs(); + + /** + * @param jobName + * @Description: 立即运行任务,这里的立即运行,只会运行一次,方便测试时用。 + */ + void triggerJob(String jobName); + + /** + * @param jobName + * @param jobGroupName + * @Description: 立即运行任务,这里的立即运行,只会运行一次,方便测试时用。 + */ + void triggerJob(String jobName, String jobGroupName); + +} diff --git a/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java new file mode 100644 index 0000000..c9068b7 --- /dev/null +++ b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface StatusEnum { + //任务开启 + String STATUS_OPEN = "1"; + //任务关闭 + String STATUS_CLOSE = "0"; + + +} diff --git a/casic-data/pom.xml b/casic-data/pom.xml index 7b9d140..aca0a62 100644 --- a/casic-data/pom.xml +++ b/casic-data/pom.xml @@ -52,6 +52,13 @@ 2.0.0 compile + + com.casic + casic-quartz + 2.0.0 + compile + + diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java index 78b93e8..cbb235e 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java @@ -1,105 +1,106 @@ -//package com.casic.missiles.modular.system.controller; -// -//import com.casic.missiles.core.base.controller.ExportController; -//import com.stylefeng.guns.core.result.ResultData; -//import org.springframework.stereotype.Controller; -//import org.springframework.web.bind.annotation.RequestMapping; -//import org.springframework.web.bind.annotation.ResponseBody; -//import org.springframework.web.bind.annotation.PathVariable; -//import org.springframework.beans.factory.annotation.Autowired; -//import com.casic.missiles.core.page.PageFactory; -//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -//import java.util.List; -//import com.stylefeng.guns.core.common.constant.factory.PageFactory; -//import org.springframework.web.bind.annotation.RequestParam; -//import com.stylefeng.guns.modular.system.model.BusPlan; -//import com.stylefeng.guns.modular.system.service.IBusPlanService; -// -///** -// * 任务计划控制器 -// * -// * @author dev -// * @Date 2023-04-18 15:44:40 -// */ -//@Controller -//@RequestMapping("/busPlan") -//public class BusPlanController extends ExportController { -// -// -// @Autowired -// private IBusPlanService busPlanService; -// -// +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.model.BusPlan; +import com.casic.missiles.modular.system.service.IBusPlanService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.validation.Valid; +import java.util.Objects; + +/** + * 任务计划控制器 + * + * @author dev + * @Date 2023-04-18 15:44:40 + */ +@Controller +@RequestMapping("/task") +public class BusPlanController extends ExportController { + + + @Autowired + private IBusPlanService busPlanService; + + + /** + * 获取任务计划列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String condition) { + return busPlanService.list(null); + } + + /** + * 获取任务计划分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = new QueryWrapper<>(); + page = busPlanService.page(page, query); + return super.packForBT(page); + } + + /** + * 新增任务计划 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusPlan busPlan) { + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("新增失败"); + + } + + /** + * 删除任务计划 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); + } + // /** -// * 获取任务计划列表 -// */ -// @RequestMapping(value = "/list") -// @ResponseBody -// public Object list(String condition) { -// return busPlanService.selectList(null); -// } -// -// /** -// * 获取任务计划分页列表 -// */ -// @RequestMapping(value = "/listPage") -// @ResponseBody -// public Object listPage(String condition) { -// Page page = new PageFactory().defaultPage(); -// EntityWrapper query = new EntityWrapper<>(); -// page = busPlanService.selectPage(page,query); -// return super.packForBT(page); -// } -// /** -// * 新增任务计划 -// */ -// @RequestMapping(value = "/add") -// @ResponseBody -// public Object add(BusPlan busPlan) { -// busPlanService.insert(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 删除任务计划 +// * 任务启用或停止 // */ // @RequestMapping(value = "/delete") // @ResponseBody -// public Object delete(@RequestParam String busPlanId) { -// busPlanService.deleteById(busPlanId); -// return SUCCESS_TIP; +// public Object delete(@RequestBody @Valid IdDTO idDTO) { +// Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); +// return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); // } -// -// /** -// * 批量删除 -// */ -// @RequestMapping(value = "/batchDelete") -// @ResponseBody -// public Object delete(@RequestParam("busPlanIds") List busPlanIds) { -// busPlanService.deleteBatchIds(busPlanIds); -// return SUCCESS_TIP; -// } -// -// /** -// * 修改任务计划 -// */ -// @RequestMapping(value = "/update") -// @ResponseBody -// public Object update(BusPlan busPlan) { -// busPlanService.updateById(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 任务计划详情 -// */ -// @RequestMapping(value = "/detail/{busPlanId}") -// @ResponseBody -// public Object detail(@PathVariable("busPlanId") String busPlanId) { -// ResultData resultData = new ResultData(); -// resultData.setCode(200); -// resultData.setMessage("查询详情成功"); -// resultData.setData(busPlanService.selectById(busPlanId)); -// return resultData; -// } -//} + + + /** + * 修改任务计划 + */ + @RequestMapping(value = "/edit") + @ResponseBody + public Object edit(@RequestBody @Valid BusPlan busPlan) { + Assert.isFalse(Objects.isNull(busPlan.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("更新失败"); + } + +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java new file mode 100644 index 0000000..fc97688 --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StartTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StartTaskJob.class); + + private String jobId; + + + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(String id) { + //toDo:开启巡航 + + System.out.println("开始执行了------"); + } +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java new file mode 100644 index 0000000..0cd49ec --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java @@ -0,0 +1,42 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StopTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StopTaskJob.class); + + private Integer jobId; + + + + public void setJobId(Integer jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(Integer id) { + + //toDo:关闭巡航 + + System.out.println("停止执行了------"); + } +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java b/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java index 0f648dd..aed7813 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java @@ -13,4 +13,6 @@ */ public interface IBusPlanService extends IService { + boolean saveOrUpdateBusPlan(BusPlan busPlan); + } diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java b/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java index 1df7e2e..a46b298 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java @@ -1,11 +1,22 @@ package com.casic.missiles.modular.system.service.impl; -import com.casic.missiles.modular.system.model.BusPlan; -import com.casic.missiles.modular.system.dao.BusPlanMapper; -import com.casic.missiles.modular.system.service.IBusPlanService; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.enums.StatusEnum; +import com.casic.missiles.modular.system.dao.BusPlanMapper; +import com.casic.missiles.modular.system.job.StartTaskJob; +import com.casic.missiles.modular.system.job.StopTaskJob; +import com.casic.missiles.modular.system.model.BusPlan; +import com.casic.missiles.modular.system.service.IBusPlanService; +import com.casic.missiles.quartz.service.IQuartzManager; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + /** *

* 任务计划表 服务实现类 @@ -17,4 +28,34 @@ @Service public class BusPlanServiceImpl extends ServiceImpl implements IBusPlanService { + @Autowired + private IQuartzManager quartzManager; + + @Override + public boolean saveOrUpdateBusPlan(BusPlan busPlan) { + //先保存数据 + if (this.saveOrUpdate(busPlan)) { + //若已启动任务,则创建启动job任务 + if (StatusEnum.STATUS_OPEN.equals(busPlan.getStatus())) { + //到时间开启 + if (ObjectUtil.isNotEmpty(busPlan.getBeginDate()) && ObjectUtil.isNotEmpty(busPlan.getBeginTime())) { + Date startTaskTime = DateUtil.parseDateTime(busPlan.getBeginDate()+" "+busPlan.getBeginTime()); + String jobName = "startPatrolTask" + busPlan.getId(); + Map map = new HashMap<>(); + map.put("jobId", busPlan.getId()); + quartzManager.addJob(jobName, StartTaskJob.class, startTaskTime, map); + } + //到时间关闭 + if (ObjectUtil.isNotEmpty(busPlan.getEndDate()) && ObjectUtil.isNotEmpty(busPlan.getEndTime())) { + Date endTaskTime = DateUtil.parseDateTime(busPlan.getEndDate()+" "+busPlan.getEndTime()); + String jobName = "endPatrolTask" + busPlan.getId(); + Map map = new HashMap<>(); + map.put("jobId", busPlan.getId()); + quartzManager.addJob(jobName, StopTaskJob.class, endTaskTime, map); + } + } + return true; + } + return false; + } } diff --git a/casic-quartz/pom.xml b/casic-quartz/pom.xml new file mode 100644 index 0000000..1874a17 --- /dev/null +++ b/casic-quartz/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + + com.casic + casic-PTZ + 2.0.0 + ../pom.xml + + + casic-quartz + 2.0.0 + jar + + + + org.springframework.boot + spring-boot-starter-aop + + + org.quartz-scheduler + quartz + 2.3.0 + + + com.mchange + c3p0 + 0.9.5.2 + + + org.springframework + spring-context-support + 5.0.5.RELEASE + + + + \ No newline at end of file diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/StartupRunner.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/StartupRunner.java new file mode 100644 index 0000000..467ef55 --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/StartupRunner.java @@ -0,0 +1,20 @@ +package com.casic.missiles.quartz; + +import com.casic.missiles.quartz.service.IQuartzManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +public class StartupRunner implements CommandLineRunner { + + @Autowired + public IQuartzManager quartzManager; + + @Override + public void run(String... args) { + + quartzManager.resumeJob(); + System.out.println(">>>>>>>>>>>>>>>加载定时任务<<<<<<<<<<<<<"); + } +} \ No newline at end of file diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/config/JobFactory.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/JobFactory.java new file mode 100644 index 0000000..28c91fe --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/JobFactory.java @@ -0,0 +1,33 @@ +package com.casic.missiles.quartz.config; + +import org.quartz.spi.TriggerFiredBundle; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.scheduling.quartz.AdaptableJobFactory; +import org.springframework.stereotype.Component; + + +public class JobFactory extends AdaptableJobFactory { + /** + * AutowireCapableBeanFactory接口是BeanFactory的子类 + * 可以连接和填充那些生命周期不被Spring管理的已存在的bean实例 + */ + private AutowireCapableBeanFactory factory; + + public JobFactory(AutowireCapableBeanFactory factory) { + this.factory = factory; + } + + /** + * 创建Job实例 + */ + @Override + protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { + + // 实例化对象 + Object job = super.createJobInstance(bundle); + // 进行注入(Spring管理该Bean) + factory.autowireBean(job); + //返回对象 + return job; + } +} diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/config/QuartzConfig.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/QuartzConfig.java new file mode 100644 index 0000000..adec34e --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/QuartzConfig.java @@ -0,0 +1,54 @@ +package com.casic.missiles.quartz.config; + +import org.quartz.Scheduler; +import org.quartz.spi.JobFactory; +import org.quartz.spi.TriggerFiredBundle; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; +import org.springframework.scheduling.quartz.AdaptableJobFactory; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; + +@Configuration +public class QuartzConfig { + @Autowired + private JobFactory jobFactory; + + @Autowired + private AutowireCapableBeanFactory capableBeanFactory; + + /** + * 当触发器触发时,与之关联的任务被Scheduler中配置的JobFactory实例化,也就是每触发一次,就会创建一个任务的实例化对象 + * (如果缺省)则调用Job类的newInstance方法生成一个实例 + * (这里选择自定义)并将创建的Job实例化交给IoC管理 + * @return + */ + @Bean + public JobFactory jobFactory() { + return new AdaptableJobFactory() { + @Override + protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { + Object jobInstance = super.createJobInstance(bundle); + capableBeanFactory.autowireBean(jobInstance); + return jobInstance; + } + }; + } + + @Bean + public SchedulerFactoryBean schedulerFactoryBean() { + SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); + schedulerFactoryBean.setJobFactory(jobFactory); + //延迟启动 + schedulerFactoryBean.setStartupDelay(1); + schedulerFactoryBean.setConfigLocation(new ClassPathResource("/quartz.properties")); + return schedulerFactoryBean; + } + + @Bean + public Scheduler scheduler() { + return schedulerFactoryBean().getScheduler(); + } +} \ No newline at end of file diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/job/MyJob.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/job/MyJob.java new file mode 100644 index 0000000..947aadc --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/job/MyJob.java @@ -0,0 +1,27 @@ +package com.casic.missiles.quartz.job; + +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +import java.text.SimpleDateFormat; +import java.util.Date; + +//例子 +public class MyJob implements Job { + + private String name; + + public void setName(String name) { + this.name = name; + } + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + + System.out.println("CRON ----> schedule job1 is running ... + " + name + " ----> " + dateFormat.format(new Date())); + } +} \ No newline at end of file diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/service/IQuartzManager.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/service/IQuartzManager.java new file mode 100644 index 0000000..40a3495 --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/service/IQuartzManager.java @@ -0,0 +1,159 @@ +package com.casic.missiles.quartz.service; + +import java.util.*; + +public interface IQuartzManager { + + /** + * @param jobName 任务名 + * @param cls 任务 + * @param date 具体执行时间点 + * @Description: 延时一段时间后触发任务 + */ + void addJob(String jobName, Class cls, Date date); + + /** + * @param jobName 任务名 + * @param cls 任务 + * @param date 具体执行时间点 + * @param params 传入的参数对 + * @Description: 延时一段时间后触发任务 + */ + void addJob(String jobName, Class cls, Date date, Map params); + + + /** + * @param jobName 任务名 + * @param cls 任务 + * @param amount 延时时间,单位 秒 + * @Description: 延时一段时间后触发任务 + */ + void addJob(String jobName, Class cls, int amount); + + /** + * @param jobName 任务名 + * @param cls 任务 + * @param amount 延时时间,单位 秒 + * @param params 传入的参数对 + * @Description: 延时一段时间后触发任务 + */ + void addJob(String jobName, Class cls, int amount, Map params); + + + /** + * @param jobName 任务名 + * @param cls 任务 + * @param cron 时间设置,cron表达式 + * @Description: 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名 + */ + void addJob(String jobName, Class cls, String cron); + + /** + * @param jobName 任务名 + * @param jobGroupName 任务组名 + * @param triggerName 触发器名 + * @param triggerGroupName 触发器组名 + * @param jobClass 任务 + * @param cron 时间设置,cron表达式 + * @Description: 添加一个定时任务 + */ + void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, Class jobClass, String cron); + + /** + * @param jobName + * @param cron + * @Description: 修改一个任务的触发时间(使用默认的任务组名 , 触发器名 , 触发器组名) + */ + void modifyJobTime(String jobName, String cron); + + + /** + * @param oldJobName :原任务名 + * @param jobName + * @param jobclass + * @param cron + * @Description:修改任务,(可以修改任务名,任务类,触发时间) + */ + void modifyJob(String oldJobName, String jobName, Class jobclass, String cron); + + + /** + * @param triggerName + * @param triggerGroupName + * @param cron + * @Description: 修改一个任务的触发时间 + */ + void modifyJobTime(String triggerName, String triggerGroupName, String cron); + + + /** + * @param jobName + * @Description 移除一个任务(使用默认的任务组名 , 触发器名 , 触发器组名) + */ + void removeJob(String jobName); + + /** + * @param jobName + * @param jobGroupName + * @param triggerName + * @param triggerGroupName + * @Description: 移除一个任务 + */ + void removeJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName); + + + /** + * @param jobName + * @Description:暂停一个任务(使用默认组名) + */ + void pauseJob(String jobName); + + /** + * @param jobName + * @param jobGroupName + * @Description:暂停一个任务 + */ + void pauseJob(String jobName, String jobGroupName); + + /** + * @Description:恢复所有任务 + */ + void resumeJob(); + + /** + * @param jobName + * @Description:恢复一个任务(使用默认组名) + */ + void resumeJob(String jobName); + + /** + * @param jobName + * @param jobGroupName + * @Description:恢复一个任务 + */ + void resumeJob(String jobName, String jobGroupName); + + /** + * @Description:启动所有定时任务 + */ + void startJobs(); + + /** + * @Description 关闭所有定时任务 + */ + void shutdownJobs(); + + /** + * @param jobName + * @Description: 立即运行任务,这里的立即运行,只会运行一次,方便测试时用。 + */ + void triggerJob(String jobName); + + /** + * @param jobName + * @param jobGroupName + * @Description: 立即运行任务,这里的立即运行,只会运行一次,方便测试时用。 + */ + void triggerJob(String jobName, String jobGroupName); + +} diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/service/impl/QuartzManagerImpl.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/service/impl/QuartzManagerImpl.java new file mode 100644 index 0000000..0bed2de --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/service/impl/QuartzManagerImpl.java @@ -0,0 +1,390 @@ +package com.casic.missiles.quartz.service.impl; + +import com.casic.missiles.quartz.service.IQuartzManager; +import org.quartz.*; +import org.quartz.Trigger.TriggerState; +import org.quartz.impl.StdSchedulerFactory; +import org.quartz.impl.triggers.CronTriggerImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.Calendar; + +@Component +public class QuartzManagerImpl implements IQuartzManager { + + @Qualifier("scheduler") + @Autowired + private Scheduler sched; + + //private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory(); + private String JOB_GROUP_NAME = "MY_JOBGROUP_NAME"; + private String TRIGGER_GROUP_NAME = "MY_TRIGGERGROUP_NAME"; + + @SuppressWarnings({"rawtypes", "unchecked"}) + public void addJob(String jobName, Class cls, int amount) { + + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.SECOND, amount); + addJob(jobName, cls, calendar.getTime(), null); + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + public void addJob(String jobName, Class cls, int amount, Map params) { + + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.SECOND, amount); + addJob(jobName, cls, calendar.getTime(), params); + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + public void addJob(String jobName, Class cls, Date date) { + + addJob(jobName, cls, date, null); + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + public void addJob(String jobName, Class cls, Date date, Map params) { + try { + + //Scheduler sched = gSchedulerFactory.getScheduler(); + JobDetail job; + if(params != null){ + job = JobBuilder.newJob(cls) + .withIdentity(jobName, JOB_GROUP_NAME) + .usingJobData(new JobDataMap(params)) + .build(); + }else{ + job = JobBuilder.newJob(cls) + .withIdentity(jobName, JOB_GROUP_NAME) + .build(); + } + + + Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, TRIGGER_GROUP_NAME) + .startAt(date) + .withSchedule(SimpleScheduleBuilder.simpleSchedule()).build(); + + // 交给scheduler去调度 + sched.scheduleJob(job, trigger); + // 启动 + if (!sched.isShutdown()) { + sched.start(); + System.out.println("添加任务:" + jobName); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + @SuppressWarnings({"rawtypes", "unchecked"}) + public void addJob(String jobName, Class cls, String cron) { + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + JobDetail job = JobBuilder.newJob(cls).withIdentity(jobName, JOB_GROUP_NAME).build(); + // 表达式调度构建器 + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); + // 按新的cronExpression表达式构建一个新的trigger + Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, TRIGGER_GROUP_NAME) + .withSchedule(scheduleBuilder).build(); + + // 交给scheduler去调度 + sched.scheduleJob(job, trigger); + + // 启动 + if (!sched.isShutdown()) { + sched.start(); + System.out.println("添加任务:" + jobName); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + @SuppressWarnings({"rawtypes", "unchecked"}) + public void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, + Class jobClass, String cron) { + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + JobDetail job = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build(); + // 表达式调度构建器 + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); + // 按新的cronExpression表达式构建一个新的trigger + Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroupName) + .withSchedule(scheduleBuilder).build(); + sched.scheduleJob(job, trigger); + // 启动 + if (!sched.isShutdown()) { + sched.start(); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + public void modifyJobTime(String jobName, String cron) { + TriggerKey triggerKey = TriggerKey.triggerKey(jobName, TRIGGER_GROUP_NAME); + + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey); + if (trigger == null) { + return; + } + String oldTime = trigger.getCronExpression(); + if (!oldTime.equalsIgnoreCase(cron)) { + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); + // 按新的cronExpression表达式重新构建trigger + trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); + // 按新的trigger重新设置job执行 + sched.rescheduleJob(triggerKey, trigger); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + @SuppressWarnings({"rawtypes", "unchecked"}) + public void modifyJob(String oldJobName, String jobName, Class jobclass, String cron) { + /* + * removeJob(oldJobName); + * addJob(jobName, jobclass, cron); + * System.out.println("修改任务"+oldJobName); + */ + TriggerKey triggerKey = TriggerKey.triggerKey(oldJobName, TRIGGER_GROUP_NAME); + JobKey jobKey = JobKey.jobKey(oldJobName, JOB_GROUP_NAME); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + Trigger trigger = sched.getTrigger(triggerKey); + if (trigger == null) { + return; + } + sched.pauseTrigger(triggerKey);// 停止触发器 + sched.unscheduleJob(triggerKey);// 移除触发器 + sched.deleteJob(jobKey);// 删除任务 + System.out.println("移除任务:" + oldJobName); + + JobDetail job = JobBuilder.newJob(jobclass).withIdentity(jobName, JOB_GROUP_NAME).build(); + // 表达式调度构建器 + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); + // 按新的cronExpression表达式构建一个新的trigger + Trigger newTrigger = TriggerBuilder.newTrigger().withIdentity(jobName, TRIGGER_GROUP_NAME) + .withSchedule(scheduleBuilder).build(); + + // 交给scheduler去调度 + sched.scheduleJob(job, newTrigger); + + // 启动 + if (!sched.isShutdown()) { + sched.start(); + System.out.println("添加新任务:" + jobName); + } + System.out.println("修改任务【" + oldJobName + "】为:" + jobName); + } catch (Exception e) { + throw new RuntimeException(e); + } + + } + + + public void modifyJobTime(String triggerName, String triggerGroupName, String cron) { + TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey); + if (trigger == null) { + return; + } + String oldTime = trigger.getCronExpression(); + if (!oldTime.equalsIgnoreCase(cron)) { + // trigger已存在,则更新相应的定时设置 + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); + // 按新的cronExpression表达式重新构建trigger + trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); + // 按新的trigger重新设置job执行 + sched.resumeTrigger(trigger.getKey()); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + public void removeJob(String jobName) { + TriggerKey triggerKey = TriggerKey.triggerKey(jobName, TRIGGER_GROUP_NAME); + JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + Trigger trigger = sched.getTrigger(triggerKey); + if (trigger == null) { + return; + } + sched.pauseTrigger(triggerKey);// 停止触发器 + sched.unscheduleJob(triggerKey);// 移除触发器 + sched.deleteJob(jobKey);// 删除任务 + System.out.println("移除任务:" + jobName); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + public void removeJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName) { + TriggerKey triggerKey = TriggerKey.triggerKey(jobName, triggerGroupName); + JobKey jobKey = JobKey.jobKey(jobName, jobGroupName); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + sched.pauseTrigger(triggerKey);// 停止触发器 + sched.unscheduleJob(triggerKey);// 移除触发器 + sched.deleteJob(jobKey);// 删除任务 + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + public void pauseJob(String jobName) { + JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + sched.pauseJob(jobKey); + } catch (SchedulerException e) { + e.printStackTrace(); + } + } + + + public void pauseJob(String jobName, String jobGroupName) { + JobKey jobKey = JobKey.jobKey(jobName, jobGroupName); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + sched.pauseJob(jobKey); + } catch (SchedulerException e) { + e.printStackTrace(); + } + } + + public void resumeJob() { + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + List triggerGroups = sched.getTriggerGroupNames(); + //遍历获取每个触发器组 + for (int i = 0; i < triggerGroups.size(); i++) { + List triggers = sched.getTriggerGroupNames(); + //遍历每个触发器组 + for (int j = 0; j < triggers.size(); j++) { + sched.resumeJob(new JobKey(triggers.get(j), + triggerGroups.get(i))); + } + } + sched.start(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void resumeJob(String jobName) { + JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + sched.resumeJob(jobKey); + } catch (SchedulerException e) { + e.printStackTrace(); + } + } + + + public void resumeJob(String jobName, String jobGroupName) { + JobKey jobKey = JobKey.jobKey(jobName, jobGroupName); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + sched.resumeJob(jobKey); + } catch (SchedulerException e) { + e.printStackTrace(); + } + } + + + public void startJobs() { + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + sched.start(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + public void shutdownJobs() { + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + if (!sched.isShutdown()) { + sched.shutdown(); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + public void triggerJob(String jobName) { + JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + sched.triggerJob(jobKey); + } catch (SchedulerException e) { + e.printStackTrace(); + } + } + + + public void triggerJob(String jobName, String jobGroupName) { + JobKey jobKey = JobKey.jobKey(jobName, jobGroupName); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + sched.triggerJob(jobKey); + } catch (SchedulerException e) { + e.printStackTrace(); + } + } + + + public String getTriggerState(String jobName) { + TriggerKey triggerKey = TriggerKey.triggerKey(jobName, TRIGGER_GROUP_NAME); + String name = null; + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + TriggerState triggerState = sched.getTriggerState(triggerKey); + name = triggerState.name(); + } catch (SchedulerException e) { + e.printStackTrace(); + } + return name; + } + + + public List getRecentTriggerTime(String cron) { + List list = new ArrayList(); + try { + CronTriggerImpl cronTriggerImpl = new CronTriggerImpl(); + cronTriggerImpl.setCronExpression(cron); + List dates = TriggerUtils.computeFireTimes(cronTriggerImpl, null, 8); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + for (Date date : dates) { + list.add(dateFormat.format(date)); + } + + } catch (ParseException e) { + e.printStackTrace(); + } + return list; + } +} \ No newline at end of file diff --git a/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java new file mode 100644 index 0000000..c9068b7 --- /dev/null +++ b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface StatusEnum { + //任务开启 + String STATUS_OPEN = "1"; + //任务关闭 + String STATUS_CLOSE = "0"; + + +} diff --git a/casic-data/pom.xml b/casic-data/pom.xml index 7b9d140..aca0a62 100644 --- a/casic-data/pom.xml +++ b/casic-data/pom.xml @@ -52,6 +52,13 @@ 2.0.0 compile + + com.casic + casic-quartz + 2.0.0 + compile + + diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java index 78b93e8..cbb235e 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java @@ -1,105 +1,106 @@ -//package com.casic.missiles.modular.system.controller; -// -//import com.casic.missiles.core.base.controller.ExportController; -//import com.stylefeng.guns.core.result.ResultData; -//import org.springframework.stereotype.Controller; -//import org.springframework.web.bind.annotation.RequestMapping; -//import org.springframework.web.bind.annotation.ResponseBody; -//import org.springframework.web.bind.annotation.PathVariable; -//import org.springframework.beans.factory.annotation.Autowired; -//import com.casic.missiles.core.page.PageFactory; -//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -//import java.util.List; -//import com.stylefeng.guns.core.common.constant.factory.PageFactory; -//import org.springframework.web.bind.annotation.RequestParam; -//import com.stylefeng.guns.modular.system.model.BusPlan; -//import com.stylefeng.guns.modular.system.service.IBusPlanService; -// -///** -// * 任务计划控制器 -// * -// * @author dev -// * @Date 2023-04-18 15:44:40 -// */ -//@Controller -//@RequestMapping("/busPlan") -//public class BusPlanController extends ExportController { -// -// -// @Autowired -// private IBusPlanService busPlanService; -// -// +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.model.BusPlan; +import com.casic.missiles.modular.system.service.IBusPlanService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.validation.Valid; +import java.util.Objects; + +/** + * 任务计划控制器 + * + * @author dev + * @Date 2023-04-18 15:44:40 + */ +@Controller +@RequestMapping("/task") +public class BusPlanController extends ExportController { + + + @Autowired + private IBusPlanService busPlanService; + + + /** + * 获取任务计划列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String condition) { + return busPlanService.list(null); + } + + /** + * 获取任务计划分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = new QueryWrapper<>(); + page = busPlanService.page(page, query); + return super.packForBT(page); + } + + /** + * 新增任务计划 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusPlan busPlan) { + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("新增失败"); + + } + + /** + * 删除任务计划 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); + } + // /** -// * 获取任务计划列表 -// */ -// @RequestMapping(value = "/list") -// @ResponseBody -// public Object list(String condition) { -// return busPlanService.selectList(null); -// } -// -// /** -// * 获取任务计划分页列表 -// */ -// @RequestMapping(value = "/listPage") -// @ResponseBody -// public Object listPage(String condition) { -// Page page = new PageFactory().defaultPage(); -// EntityWrapper query = new EntityWrapper<>(); -// page = busPlanService.selectPage(page,query); -// return super.packForBT(page); -// } -// /** -// * 新增任务计划 -// */ -// @RequestMapping(value = "/add") -// @ResponseBody -// public Object add(BusPlan busPlan) { -// busPlanService.insert(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 删除任务计划 +// * 任务启用或停止 // */ // @RequestMapping(value = "/delete") // @ResponseBody -// public Object delete(@RequestParam String busPlanId) { -// busPlanService.deleteById(busPlanId); -// return SUCCESS_TIP; +// public Object delete(@RequestBody @Valid IdDTO idDTO) { +// Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); +// return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); // } -// -// /** -// * 批量删除 -// */ -// @RequestMapping(value = "/batchDelete") -// @ResponseBody -// public Object delete(@RequestParam("busPlanIds") List busPlanIds) { -// busPlanService.deleteBatchIds(busPlanIds); -// return SUCCESS_TIP; -// } -// -// /** -// * 修改任务计划 -// */ -// @RequestMapping(value = "/update") -// @ResponseBody -// public Object update(BusPlan busPlan) { -// busPlanService.updateById(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 任务计划详情 -// */ -// @RequestMapping(value = "/detail/{busPlanId}") -// @ResponseBody -// public Object detail(@PathVariable("busPlanId") String busPlanId) { -// ResultData resultData = new ResultData(); -// resultData.setCode(200); -// resultData.setMessage("查询详情成功"); -// resultData.setData(busPlanService.selectById(busPlanId)); -// return resultData; -// } -//} + + + /** + * 修改任务计划 + */ + @RequestMapping(value = "/edit") + @ResponseBody + public Object edit(@RequestBody @Valid BusPlan busPlan) { + Assert.isFalse(Objects.isNull(busPlan.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("更新失败"); + } + +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java new file mode 100644 index 0000000..fc97688 --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StartTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StartTaskJob.class); + + private String jobId; + + + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(String id) { + //toDo:开启巡航 + + System.out.println("开始执行了------"); + } +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java new file mode 100644 index 0000000..0cd49ec --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java @@ -0,0 +1,42 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StopTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StopTaskJob.class); + + private Integer jobId; + + + + public void setJobId(Integer jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(Integer id) { + + //toDo:关闭巡航 + + System.out.println("停止执行了------"); + } +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java b/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java index 0f648dd..aed7813 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java @@ -13,4 +13,6 @@ */ public interface IBusPlanService extends IService { + boolean saveOrUpdateBusPlan(BusPlan busPlan); + } diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java b/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java index 1df7e2e..a46b298 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java @@ -1,11 +1,22 @@ package com.casic.missiles.modular.system.service.impl; -import com.casic.missiles.modular.system.model.BusPlan; -import com.casic.missiles.modular.system.dao.BusPlanMapper; -import com.casic.missiles.modular.system.service.IBusPlanService; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.enums.StatusEnum; +import com.casic.missiles.modular.system.dao.BusPlanMapper; +import com.casic.missiles.modular.system.job.StartTaskJob; +import com.casic.missiles.modular.system.job.StopTaskJob; +import com.casic.missiles.modular.system.model.BusPlan; +import com.casic.missiles.modular.system.service.IBusPlanService; +import com.casic.missiles.quartz.service.IQuartzManager; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + /** *

* 任务计划表 服务实现类 @@ -17,4 +28,34 @@ @Service public class BusPlanServiceImpl extends ServiceImpl implements IBusPlanService { + @Autowired + private IQuartzManager quartzManager; + + @Override + public boolean saveOrUpdateBusPlan(BusPlan busPlan) { + //先保存数据 + if (this.saveOrUpdate(busPlan)) { + //若已启动任务,则创建启动job任务 + if (StatusEnum.STATUS_OPEN.equals(busPlan.getStatus())) { + //到时间开启 + if (ObjectUtil.isNotEmpty(busPlan.getBeginDate()) && ObjectUtil.isNotEmpty(busPlan.getBeginTime())) { + Date startTaskTime = DateUtil.parseDateTime(busPlan.getBeginDate()+" "+busPlan.getBeginTime()); + String jobName = "startPatrolTask" + busPlan.getId(); + Map map = new HashMap<>(); + map.put("jobId", busPlan.getId()); + quartzManager.addJob(jobName, StartTaskJob.class, startTaskTime, map); + } + //到时间关闭 + if (ObjectUtil.isNotEmpty(busPlan.getEndDate()) && ObjectUtil.isNotEmpty(busPlan.getEndTime())) { + Date endTaskTime = DateUtil.parseDateTime(busPlan.getEndDate()+" "+busPlan.getEndTime()); + String jobName = "endPatrolTask" + busPlan.getId(); + Map map = new HashMap<>(); + map.put("jobId", busPlan.getId()); + quartzManager.addJob(jobName, StopTaskJob.class, endTaskTime, map); + } + } + return true; + } + return false; + } } diff --git a/casic-quartz/pom.xml b/casic-quartz/pom.xml new file mode 100644 index 0000000..1874a17 --- /dev/null +++ b/casic-quartz/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + + com.casic + casic-PTZ + 2.0.0 + ../pom.xml + + + casic-quartz + 2.0.0 + jar + + + + org.springframework.boot + spring-boot-starter-aop + + + org.quartz-scheduler + quartz + 2.3.0 + + + com.mchange + c3p0 + 0.9.5.2 + + + org.springframework + spring-context-support + 5.0.5.RELEASE + + + + \ No newline at end of file diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/StartupRunner.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/StartupRunner.java new file mode 100644 index 0000000..467ef55 --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/StartupRunner.java @@ -0,0 +1,20 @@ +package com.casic.missiles.quartz; + +import com.casic.missiles.quartz.service.IQuartzManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +public class StartupRunner implements CommandLineRunner { + + @Autowired + public IQuartzManager quartzManager; + + @Override + public void run(String... args) { + + quartzManager.resumeJob(); + System.out.println(">>>>>>>>>>>>>>>加载定时任务<<<<<<<<<<<<<"); + } +} \ No newline at end of file diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/config/JobFactory.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/JobFactory.java new file mode 100644 index 0000000..28c91fe --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/JobFactory.java @@ -0,0 +1,33 @@ +package com.casic.missiles.quartz.config; + +import org.quartz.spi.TriggerFiredBundle; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.scheduling.quartz.AdaptableJobFactory; +import org.springframework.stereotype.Component; + + +public class JobFactory extends AdaptableJobFactory { + /** + * AutowireCapableBeanFactory接口是BeanFactory的子类 + * 可以连接和填充那些生命周期不被Spring管理的已存在的bean实例 + */ + private AutowireCapableBeanFactory factory; + + public JobFactory(AutowireCapableBeanFactory factory) { + this.factory = factory; + } + + /** + * 创建Job实例 + */ + @Override + protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { + + // 实例化对象 + Object job = super.createJobInstance(bundle); + // 进行注入(Spring管理该Bean) + factory.autowireBean(job); + //返回对象 + return job; + } +} diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/config/QuartzConfig.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/QuartzConfig.java new file mode 100644 index 0000000..adec34e --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/QuartzConfig.java @@ -0,0 +1,54 @@ +package com.casic.missiles.quartz.config; + +import org.quartz.Scheduler; +import org.quartz.spi.JobFactory; +import org.quartz.spi.TriggerFiredBundle; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; +import org.springframework.scheduling.quartz.AdaptableJobFactory; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; + +@Configuration +public class QuartzConfig { + @Autowired + private JobFactory jobFactory; + + @Autowired + private AutowireCapableBeanFactory capableBeanFactory; + + /** + * 当触发器触发时,与之关联的任务被Scheduler中配置的JobFactory实例化,也就是每触发一次,就会创建一个任务的实例化对象 + * (如果缺省)则调用Job类的newInstance方法生成一个实例 + * (这里选择自定义)并将创建的Job实例化交给IoC管理 + * @return + */ + @Bean + public JobFactory jobFactory() { + return new AdaptableJobFactory() { + @Override + protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { + Object jobInstance = super.createJobInstance(bundle); + capableBeanFactory.autowireBean(jobInstance); + return jobInstance; + } + }; + } + + @Bean + public SchedulerFactoryBean schedulerFactoryBean() { + SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); + schedulerFactoryBean.setJobFactory(jobFactory); + //延迟启动 + schedulerFactoryBean.setStartupDelay(1); + schedulerFactoryBean.setConfigLocation(new ClassPathResource("/quartz.properties")); + return schedulerFactoryBean; + } + + @Bean + public Scheduler scheduler() { + return schedulerFactoryBean().getScheduler(); + } +} \ No newline at end of file diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/job/MyJob.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/job/MyJob.java new file mode 100644 index 0000000..947aadc --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/job/MyJob.java @@ -0,0 +1,27 @@ +package com.casic.missiles.quartz.job; + +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +import java.text.SimpleDateFormat; +import java.util.Date; + +//例子 +public class MyJob implements Job { + + private String name; + + public void setName(String name) { + this.name = name; + } + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + + System.out.println("CRON ----> schedule job1 is running ... + " + name + " ----> " + dateFormat.format(new Date())); + } +} \ No newline at end of file diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/service/IQuartzManager.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/service/IQuartzManager.java new file mode 100644 index 0000000..40a3495 --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/service/IQuartzManager.java @@ -0,0 +1,159 @@ +package com.casic.missiles.quartz.service; + +import java.util.*; + +public interface IQuartzManager { + + /** + * @param jobName 任务名 + * @param cls 任务 + * @param date 具体执行时间点 + * @Description: 延时一段时间后触发任务 + */ + void addJob(String jobName, Class cls, Date date); + + /** + * @param jobName 任务名 + * @param cls 任务 + * @param date 具体执行时间点 + * @param params 传入的参数对 + * @Description: 延时一段时间后触发任务 + */ + void addJob(String jobName, Class cls, Date date, Map params); + + + /** + * @param jobName 任务名 + * @param cls 任务 + * @param amount 延时时间,单位 秒 + * @Description: 延时一段时间后触发任务 + */ + void addJob(String jobName, Class cls, int amount); + + /** + * @param jobName 任务名 + * @param cls 任务 + * @param amount 延时时间,单位 秒 + * @param params 传入的参数对 + * @Description: 延时一段时间后触发任务 + */ + void addJob(String jobName, Class cls, int amount, Map params); + + + /** + * @param jobName 任务名 + * @param cls 任务 + * @param cron 时间设置,cron表达式 + * @Description: 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名 + */ + void addJob(String jobName, Class cls, String cron); + + /** + * @param jobName 任务名 + * @param jobGroupName 任务组名 + * @param triggerName 触发器名 + * @param triggerGroupName 触发器组名 + * @param jobClass 任务 + * @param cron 时间设置,cron表达式 + * @Description: 添加一个定时任务 + */ + void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, Class jobClass, String cron); + + /** + * @param jobName + * @param cron + * @Description: 修改一个任务的触发时间(使用默认的任务组名 , 触发器名 , 触发器组名) + */ + void modifyJobTime(String jobName, String cron); + + + /** + * @param oldJobName :原任务名 + * @param jobName + * @param jobclass + * @param cron + * @Description:修改任务,(可以修改任务名,任务类,触发时间) + */ + void modifyJob(String oldJobName, String jobName, Class jobclass, String cron); + + + /** + * @param triggerName + * @param triggerGroupName + * @param cron + * @Description: 修改一个任务的触发时间 + */ + void modifyJobTime(String triggerName, String triggerGroupName, String cron); + + + /** + * @param jobName + * @Description 移除一个任务(使用默认的任务组名 , 触发器名 , 触发器组名) + */ + void removeJob(String jobName); + + /** + * @param jobName + * @param jobGroupName + * @param triggerName + * @param triggerGroupName + * @Description: 移除一个任务 + */ + void removeJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName); + + + /** + * @param jobName + * @Description:暂停一个任务(使用默认组名) + */ + void pauseJob(String jobName); + + /** + * @param jobName + * @param jobGroupName + * @Description:暂停一个任务 + */ + void pauseJob(String jobName, String jobGroupName); + + /** + * @Description:恢复所有任务 + */ + void resumeJob(); + + /** + * @param jobName + * @Description:恢复一个任务(使用默认组名) + */ + void resumeJob(String jobName); + + /** + * @param jobName + * @param jobGroupName + * @Description:恢复一个任务 + */ + void resumeJob(String jobName, String jobGroupName); + + /** + * @Description:启动所有定时任务 + */ + void startJobs(); + + /** + * @Description 关闭所有定时任务 + */ + void shutdownJobs(); + + /** + * @param jobName + * @Description: 立即运行任务,这里的立即运行,只会运行一次,方便测试时用。 + */ + void triggerJob(String jobName); + + /** + * @param jobName + * @param jobGroupName + * @Description: 立即运行任务,这里的立即运行,只会运行一次,方便测试时用。 + */ + void triggerJob(String jobName, String jobGroupName); + +} diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/service/impl/QuartzManagerImpl.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/service/impl/QuartzManagerImpl.java new file mode 100644 index 0000000..0bed2de --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/service/impl/QuartzManagerImpl.java @@ -0,0 +1,390 @@ +package com.casic.missiles.quartz.service.impl; + +import com.casic.missiles.quartz.service.IQuartzManager; +import org.quartz.*; +import org.quartz.Trigger.TriggerState; +import org.quartz.impl.StdSchedulerFactory; +import org.quartz.impl.triggers.CronTriggerImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.Calendar; + +@Component +public class QuartzManagerImpl implements IQuartzManager { + + @Qualifier("scheduler") + @Autowired + private Scheduler sched; + + //private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory(); + private String JOB_GROUP_NAME = "MY_JOBGROUP_NAME"; + private String TRIGGER_GROUP_NAME = "MY_TRIGGERGROUP_NAME"; + + @SuppressWarnings({"rawtypes", "unchecked"}) + public void addJob(String jobName, Class cls, int amount) { + + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.SECOND, amount); + addJob(jobName, cls, calendar.getTime(), null); + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + public void addJob(String jobName, Class cls, int amount, Map params) { + + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.SECOND, amount); + addJob(jobName, cls, calendar.getTime(), params); + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + public void addJob(String jobName, Class cls, Date date) { + + addJob(jobName, cls, date, null); + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + public void addJob(String jobName, Class cls, Date date, Map params) { + try { + + //Scheduler sched = gSchedulerFactory.getScheduler(); + JobDetail job; + if(params != null){ + job = JobBuilder.newJob(cls) + .withIdentity(jobName, JOB_GROUP_NAME) + .usingJobData(new JobDataMap(params)) + .build(); + }else{ + job = JobBuilder.newJob(cls) + .withIdentity(jobName, JOB_GROUP_NAME) + .build(); + } + + + Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, TRIGGER_GROUP_NAME) + .startAt(date) + .withSchedule(SimpleScheduleBuilder.simpleSchedule()).build(); + + // 交给scheduler去调度 + sched.scheduleJob(job, trigger); + // 启动 + if (!sched.isShutdown()) { + sched.start(); + System.out.println("添加任务:" + jobName); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + @SuppressWarnings({"rawtypes", "unchecked"}) + public void addJob(String jobName, Class cls, String cron) { + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + JobDetail job = JobBuilder.newJob(cls).withIdentity(jobName, JOB_GROUP_NAME).build(); + // 表达式调度构建器 + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); + // 按新的cronExpression表达式构建一个新的trigger + Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, TRIGGER_GROUP_NAME) + .withSchedule(scheduleBuilder).build(); + + // 交给scheduler去调度 + sched.scheduleJob(job, trigger); + + // 启动 + if (!sched.isShutdown()) { + sched.start(); + System.out.println("添加任务:" + jobName); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + @SuppressWarnings({"rawtypes", "unchecked"}) + public void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, + Class jobClass, String cron) { + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + JobDetail job = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build(); + // 表达式调度构建器 + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); + // 按新的cronExpression表达式构建一个新的trigger + Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroupName) + .withSchedule(scheduleBuilder).build(); + sched.scheduleJob(job, trigger); + // 启动 + if (!sched.isShutdown()) { + sched.start(); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + public void modifyJobTime(String jobName, String cron) { + TriggerKey triggerKey = TriggerKey.triggerKey(jobName, TRIGGER_GROUP_NAME); + + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey); + if (trigger == null) { + return; + } + String oldTime = trigger.getCronExpression(); + if (!oldTime.equalsIgnoreCase(cron)) { + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); + // 按新的cronExpression表达式重新构建trigger + trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); + // 按新的trigger重新设置job执行 + sched.rescheduleJob(triggerKey, trigger); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + @SuppressWarnings({"rawtypes", "unchecked"}) + public void modifyJob(String oldJobName, String jobName, Class jobclass, String cron) { + /* + * removeJob(oldJobName); + * addJob(jobName, jobclass, cron); + * System.out.println("修改任务"+oldJobName); + */ + TriggerKey triggerKey = TriggerKey.triggerKey(oldJobName, TRIGGER_GROUP_NAME); + JobKey jobKey = JobKey.jobKey(oldJobName, JOB_GROUP_NAME); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + Trigger trigger = sched.getTrigger(triggerKey); + if (trigger == null) { + return; + } + sched.pauseTrigger(triggerKey);// 停止触发器 + sched.unscheduleJob(triggerKey);// 移除触发器 + sched.deleteJob(jobKey);// 删除任务 + System.out.println("移除任务:" + oldJobName); + + JobDetail job = JobBuilder.newJob(jobclass).withIdentity(jobName, JOB_GROUP_NAME).build(); + // 表达式调度构建器 + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); + // 按新的cronExpression表达式构建一个新的trigger + Trigger newTrigger = TriggerBuilder.newTrigger().withIdentity(jobName, TRIGGER_GROUP_NAME) + .withSchedule(scheduleBuilder).build(); + + // 交给scheduler去调度 + sched.scheduleJob(job, newTrigger); + + // 启动 + if (!sched.isShutdown()) { + sched.start(); + System.out.println("添加新任务:" + jobName); + } + System.out.println("修改任务【" + oldJobName + "】为:" + jobName); + } catch (Exception e) { + throw new RuntimeException(e); + } + + } + + + public void modifyJobTime(String triggerName, String triggerGroupName, String cron) { + TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey); + if (trigger == null) { + return; + } + String oldTime = trigger.getCronExpression(); + if (!oldTime.equalsIgnoreCase(cron)) { + // trigger已存在,则更新相应的定时设置 + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); + // 按新的cronExpression表达式重新构建trigger + trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); + // 按新的trigger重新设置job执行 + sched.resumeTrigger(trigger.getKey()); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + public void removeJob(String jobName) { + TriggerKey triggerKey = TriggerKey.triggerKey(jobName, TRIGGER_GROUP_NAME); + JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + Trigger trigger = sched.getTrigger(triggerKey); + if (trigger == null) { + return; + } + sched.pauseTrigger(triggerKey);// 停止触发器 + sched.unscheduleJob(triggerKey);// 移除触发器 + sched.deleteJob(jobKey);// 删除任务 + System.out.println("移除任务:" + jobName); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + public void removeJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName) { + TriggerKey triggerKey = TriggerKey.triggerKey(jobName, triggerGroupName); + JobKey jobKey = JobKey.jobKey(jobName, jobGroupName); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + sched.pauseTrigger(triggerKey);// 停止触发器 + sched.unscheduleJob(triggerKey);// 移除触发器 + sched.deleteJob(jobKey);// 删除任务 + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + public void pauseJob(String jobName) { + JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + sched.pauseJob(jobKey); + } catch (SchedulerException e) { + e.printStackTrace(); + } + } + + + public void pauseJob(String jobName, String jobGroupName) { + JobKey jobKey = JobKey.jobKey(jobName, jobGroupName); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + sched.pauseJob(jobKey); + } catch (SchedulerException e) { + e.printStackTrace(); + } + } + + public void resumeJob() { + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + List triggerGroups = sched.getTriggerGroupNames(); + //遍历获取每个触发器组 + for (int i = 0; i < triggerGroups.size(); i++) { + List triggers = sched.getTriggerGroupNames(); + //遍历每个触发器组 + for (int j = 0; j < triggers.size(); j++) { + sched.resumeJob(new JobKey(triggers.get(j), + triggerGroups.get(i))); + } + } + sched.start(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void resumeJob(String jobName) { + JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + sched.resumeJob(jobKey); + } catch (SchedulerException e) { + e.printStackTrace(); + } + } + + + public void resumeJob(String jobName, String jobGroupName) { + JobKey jobKey = JobKey.jobKey(jobName, jobGroupName); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + sched.resumeJob(jobKey); + } catch (SchedulerException e) { + e.printStackTrace(); + } + } + + + public void startJobs() { + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + sched.start(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + public void shutdownJobs() { + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + if (!sched.isShutdown()) { + sched.shutdown(); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + public void triggerJob(String jobName) { + JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + sched.triggerJob(jobKey); + } catch (SchedulerException e) { + e.printStackTrace(); + } + } + + + public void triggerJob(String jobName, String jobGroupName) { + JobKey jobKey = JobKey.jobKey(jobName, jobGroupName); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + sched.triggerJob(jobKey); + } catch (SchedulerException e) { + e.printStackTrace(); + } + } + + + public String getTriggerState(String jobName) { + TriggerKey triggerKey = TriggerKey.triggerKey(jobName, TRIGGER_GROUP_NAME); + String name = null; + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + TriggerState triggerState = sched.getTriggerState(triggerKey); + name = triggerState.name(); + } catch (SchedulerException e) { + e.printStackTrace(); + } + return name; + } + + + public List getRecentTriggerTime(String cron) { + List list = new ArrayList(); + try { + CronTriggerImpl cronTriggerImpl = new CronTriggerImpl(); + cronTriggerImpl.setCronExpression(cron); + List dates = TriggerUtils.computeFireTimes(cronTriggerImpl, null, 8); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + for (Date date : dates) { + list.add(dateFormat.format(date)); + } + + } catch (ParseException e) { + e.printStackTrace(); + } + return list; + } +} \ No newline at end of file diff --git a/casic-web/src/main/resources/quartz.properties b/casic-web/src/main/resources/quartz.properties new file mode 100644 index 0000000..429d117 --- /dev/null +++ b/casic-web/src/main/resources/quartz.properties @@ -0,0 +1,14 @@ +org.quartz.scheduler.instanceName = MyScheduler +org.quartz.threadPool.threadCount = 5 +org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX +org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate +org.quartz.jobStore.tablePrefix = QRTZ_ +org.quartz.jobStore.dataSource = myDS + +org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver +org.quartz.dataSource.myDS.URL = jdbc:mysql://111.198.10.15:11102/quartz?useSSL=false&serverTimezone=UTC +org.quartz.dataSource.myDS.user = root +org.quartz.dataSource.myDS.password = Casic203! +org.quartz.dataSource.myDS.maxConnections = 8 +org.quartz.dataSource.myDS.validationQuery = select 0 from dual +#org.quartz.dataSource.myDS.discardIdleConnectionsSeconds = 60 \ No newline at end of file diff --git a/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java new file mode 100644 index 0000000..c9068b7 --- /dev/null +++ b/casic-common/src/main/java/com/casic/missiles/enums/StatusEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface StatusEnum { + //任务开启 + String STATUS_OPEN = "1"; + //任务关闭 + String STATUS_CLOSE = "0"; + + +} diff --git a/casic-data/pom.xml b/casic-data/pom.xml index 7b9d140..aca0a62 100644 --- a/casic-data/pom.xml +++ b/casic-data/pom.xml @@ -52,6 +52,13 @@ 2.0.0 compile + + com.casic + casic-quartz + 2.0.0 + compile + + diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java index 78b93e8..cbb235e 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/controller/BusPlanController.java @@ -1,105 +1,106 @@ -//package com.casic.missiles.modular.system.controller; -// -//import com.casic.missiles.core.base.controller.ExportController; -//import com.stylefeng.guns.core.result.ResultData; -//import org.springframework.stereotype.Controller; -//import org.springframework.web.bind.annotation.RequestMapping; -//import org.springframework.web.bind.annotation.ResponseBody; -//import org.springframework.web.bind.annotation.PathVariable; -//import org.springframework.beans.factory.annotation.Autowired; -//import com.casic.missiles.core.page.PageFactory; -//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -//import java.util.List; -//import com.stylefeng.guns.core.common.constant.factory.PageFactory; -//import org.springframework.web.bind.annotation.RequestParam; -//import com.stylefeng.guns.modular.system.model.BusPlan; -//import com.stylefeng.guns.modular.system.service.IBusPlanService; -// -///** -// * 任务计划控制器 -// * -// * @author dev -// * @Date 2023-04-18 15:44:40 -// */ -//@Controller -//@RequestMapping("/busPlan") -//public class BusPlanController extends ExportController { -// -// -// @Autowired -// private IBusPlanService busPlanService; -// -// +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.model.BusPlan; +import com.casic.missiles.modular.system.service.IBusPlanService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.validation.Valid; +import java.util.Objects; + +/** + * 任务计划控制器 + * + * @author dev + * @Date 2023-04-18 15:44:40 + */ +@Controller +@RequestMapping("/task") +public class BusPlanController extends ExportController { + + + @Autowired + private IBusPlanService busPlanService; + + + /** + * 获取任务计划列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String condition) { + return busPlanService.list(null); + } + + /** + * 获取任务计划分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = new QueryWrapper<>(); + page = busPlanService.page(page, query); + return super.packForBT(page); + } + + /** + * 新增任务计划 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusPlan busPlan) { + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("新增失败"); + + } + + /** + * 删除任务计划 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); + } + // /** -// * 获取任务计划列表 -// */ -// @RequestMapping(value = "/list") -// @ResponseBody -// public Object list(String condition) { -// return busPlanService.selectList(null); -// } -// -// /** -// * 获取任务计划分页列表 -// */ -// @RequestMapping(value = "/listPage") -// @ResponseBody -// public Object listPage(String condition) { -// Page page = new PageFactory().defaultPage(); -// EntityWrapper query = new EntityWrapper<>(); -// page = busPlanService.selectPage(page,query); -// return super.packForBT(page); -// } -// /** -// * 新增任务计划 -// */ -// @RequestMapping(value = "/add") -// @ResponseBody -// public Object add(BusPlan busPlan) { -// busPlanService.insert(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 删除任务计划 +// * 任务启用或停止 // */ // @RequestMapping(value = "/delete") // @ResponseBody -// public Object delete(@RequestParam String busPlanId) { -// busPlanService.deleteById(busPlanId); -// return SUCCESS_TIP; +// public Object delete(@RequestBody @Valid IdDTO idDTO) { +// Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); +// return busPlanService.removeById(idDTO.getId()) ? ResponseData.success() : ResponseData.error("删除失败"); // } -// -// /** -// * 批量删除 -// */ -// @RequestMapping(value = "/batchDelete") -// @ResponseBody -// public Object delete(@RequestParam("busPlanIds") List busPlanIds) { -// busPlanService.deleteBatchIds(busPlanIds); -// return SUCCESS_TIP; -// } -// -// /** -// * 修改任务计划 -// */ -// @RequestMapping(value = "/update") -// @ResponseBody -// public Object update(BusPlan busPlan) { -// busPlanService.updateById(busPlan); -// return SUCCESS_TIP; -// } -// -// /** -// * 任务计划详情 -// */ -// @RequestMapping(value = "/detail/{busPlanId}") -// @ResponseBody -// public Object detail(@PathVariable("busPlanId") String busPlanId) { -// ResultData resultData = new ResultData(); -// resultData.setCode(200); -// resultData.setMessage("查询详情成功"); -// resultData.setData(busPlanService.selectById(busPlanId)); -// return resultData; -// } -//} + + + /** + * 修改任务计划 + */ + @RequestMapping(value = "/edit") + @ResponseBody + public Object edit(@RequestBody @Valid BusPlan busPlan) { + Assert.isFalse(Objects.isNull(busPlan.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return busPlanService.saveOrUpdateBusPlan(busPlan) ? ResponseData.success() : ResponseData.error("更新失败"); + } + +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java new file mode 100644 index 0000000..fc97688 --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StartTaskJob.java @@ -0,0 +1,41 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StartTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StartTaskJob.class); + + private String jobId; + + + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(String id) { + //toDo:开启巡航 + + System.out.println("开始执行了------"); + } +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java new file mode 100644 index 0000000..0cd49ec --- /dev/null +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/job/StopTaskJob.java @@ -0,0 +1,42 @@ +package com.casic.missiles.modular.system.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class StopTaskJob extends QuartzJobBean { + + private static final Logger logger = LoggerFactory.getLogger(StopTaskJob.class); + + private Integer jobId; + + + + public void setJobId(Integer jobId) { + this.jobId = jobId; + } + + @Override + public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + System.out.println("CRON ----> schedule job1 is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + logger.info("CRON ----> getJobDelay is running ... + " + jobId + " ----> " + dateFormat.format(new Date())); + getJobDelay(jobId); + } + + private void getJobDelay(Integer id) { + + //toDo:关闭巡航 + + System.out.println("停止执行了------"); + } +} diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java b/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java index 0f648dd..aed7813 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/service/IBusPlanService.java @@ -13,4 +13,6 @@ */ public interface IBusPlanService extends IService { + boolean saveOrUpdateBusPlan(BusPlan busPlan); + } diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java b/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java index 1df7e2e..a46b298 100644 --- a/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java +++ b/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/BusPlanServiceImpl.java @@ -1,11 +1,22 @@ package com.casic.missiles.modular.system.service.impl; -import com.casic.missiles.modular.system.model.BusPlan; -import com.casic.missiles.modular.system.dao.BusPlanMapper; -import com.casic.missiles.modular.system.service.IBusPlanService; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.enums.StatusEnum; +import com.casic.missiles.modular.system.dao.BusPlanMapper; +import com.casic.missiles.modular.system.job.StartTaskJob; +import com.casic.missiles.modular.system.job.StopTaskJob; +import com.casic.missiles.modular.system.model.BusPlan; +import com.casic.missiles.modular.system.service.IBusPlanService; +import com.casic.missiles.quartz.service.IQuartzManager; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + /** *

* 任务计划表 服务实现类 @@ -17,4 +28,34 @@ @Service public class BusPlanServiceImpl extends ServiceImpl implements IBusPlanService { + @Autowired + private IQuartzManager quartzManager; + + @Override + public boolean saveOrUpdateBusPlan(BusPlan busPlan) { + //先保存数据 + if (this.saveOrUpdate(busPlan)) { + //若已启动任务,则创建启动job任务 + if (StatusEnum.STATUS_OPEN.equals(busPlan.getStatus())) { + //到时间开启 + if (ObjectUtil.isNotEmpty(busPlan.getBeginDate()) && ObjectUtil.isNotEmpty(busPlan.getBeginTime())) { + Date startTaskTime = DateUtil.parseDateTime(busPlan.getBeginDate()+" "+busPlan.getBeginTime()); + String jobName = "startPatrolTask" + busPlan.getId(); + Map map = new HashMap<>(); + map.put("jobId", busPlan.getId()); + quartzManager.addJob(jobName, StartTaskJob.class, startTaskTime, map); + } + //到时间关闭 + if (ObjectUtil.isNotEmpty(busPlan.getEndDate()) && ObjectUtil.isNotEmpty(busPlan.getEndTime())) { + Date endTaskTime = DateUtil.parseDateTime(busPlan.getEndDate()+" "+busPlan.getEndTime()); + String jobName = "endPatrolTask" + busPlan.getId(); + Map map = new HashMap<>(); + map.put("jobId", busPlan.getId()); + quartzManager.addJob(jobName, StopTaskJob.class, endTaskTime, map); + } + } + return true; + } + return false; + } } diff --git a/casic-quartz/pom.xml b/casic-quartz/pom.xml new file mode 100644 index 0000000..1874a17 --- /dev/null +++ b/casic-quartz/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + + com.casic + casic-PTZ + 2.0.0 + ../pom.xml + + + casic-quartz + 2.0.0 + jar + + + + org.springframework.boot + spring-boot-starter-aop + + + org.quartz-scheduler + quartz + 2.3.0 + + + com.mchange + c3p0 + 0.9.5.2 + + + org.springframework + spring-context-support + 5.0.5.RELEASE + + + + \ No newline at end of file diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/StartupRunner.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/StartupRunner.java new file mode 100644 index 0000000..467ef55 --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/StartupRunner.java @@ -0,0 +1,20 @@ +package com.casic.missiles.quartz; + +import com.casic.missiles.quartz.service.IQuartzManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +public class StartupRunner implements CommandLineRunner { + + @Autowired + public IQuartzManager quartzManager; + + @Override + public void run(String... args) { + + quartzManager.resumeJob(); + System.out.println(">>>>>>>>>>>>>>>加载定时任务<<<<<<<<<<<<<"); + } +} \ No newline at end of file diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/config/JobFactory.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/JobFactory.java new file mode 100644 index 0000000..28c91fe --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/JobFactory.java @@ -0,0 +1,33 @@ +package com.casic.missiles.quartz.config; + +import org.quartz.spi.TriggerFiredBundle; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.scheduling.quartz.AdaptableJobFactory; +import org.springframework.stereotype.Component; + + +public class JobFactory extends AdaptableJobFactory { + /** + * AutowireCapableBeanFactory接口是BeanFactory的子类 + * 可以连接和填充那些生命周期不被Spring管理的已存在的bean实例 + */ + private AutowireCapableBeanFactory factory; + + public JobFactory(AutowireCapableBeanFactory factory) { + this.factory = factory; + } + + /** + * 创建Job实例 + */ + @Override + protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { + + // 实例化对象 + Object job = super.createJobInstance(bundle); + // 进行注入(Spring管理该Bean) + factory.autowireBean(job); + //返回对象 + return job; + } +} diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/config/QuartzConfig.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/QuartzConfig.java new file mode 100644 index 0000000..adec34e --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/config/QuartzConfig.java @@ -0,0 +1,54 @@ +package com.casic.missiles.quartz.config; + +import org.quartz.Scheduler; +import org.quartz.spi.JobFactory; +import org.quartz.spi.TriggerFiredBundle; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; +import org.springframework.scheduling.quartz.AdaptableJobFactory; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; + +@Configuration +public class QuartzConfig { + @Autowired + private JobFactory jobFactory; + + @Autowired + private AutowireCapableBeanFactory capableBeanFactory; + + /** + * 当触发器触发时,与之关联的任务被Scheduler中配置的JobFactory实例化,也就是每触发一次,就会创建一个任务的实例化对象 + * (如果缺省)则调用Job类的newInstance方法生成一个实例 + * (这里选择自定义)并将创建的Job实例化交给IoC管理 + * @return + */ + @Bean + public JobFactory jobFactory() { + return new AdaptableJobFactory() { + @Override + protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { + Object jobInstance = super.createJobInstance(bundle); + capableBeanFactory.autowireBean(jobInstance); + return jobInstance; + } + }; + } + + @Bean + public SchedulerFactoryBean schedulerFactoryBean() { + SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); + schedulerFactoryBean.setJobFactory(jobFactory); + //延迟启动 + schedulerFactoryBean.setStartupDelay(1); + schedulerFactoryBean.setConfigLocation(new ClassPathResource("/quartz.properties")); + return schedulerFactoryBean; + } + + @Bean + public Scheduler scheduler() { + return schedulerFactoryBean().getScheduler(); + } +} \ No newline at end of file diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/job/MyJob.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/job/MyJob.java new file mode 100644 index 0000000..947aadc --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/job/MyJob.java @@ -0,0 +1,27 @@ +package com.casic.missiles.quartz.job; + +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +import java.text.SimpleDateFormat; +import java.util.Date; + +//例子 +public class MyJob implements Job { + + private String name; + + public void setName(String name) { + this.name = name; + } + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + //业务逻辑 + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + + System.out.println("CRON ----> schedule job1 is running ... + " + name + " ----> " + dateFormat.format(new Date())); + } +} \ No newline at end of file diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/service/IQuartzManager.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/service/IQuartzManager.java new file mode 100644 index 0000000..40a3495 --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/service/IQuartzManager.java @@ -0,0 +1,159 @@ +package com.casic.missiles.quartz.service; + +import java.util.*; + +public interface IQuartzManager { + + /** + * @param jobName 任务名 + * @param cls 任务 + * @param date 具体执行时间点 + * @Description: 延时一段时间后触发任务 + */ + void addJob(String jobName, Class cls, Date date); + + /** + * @param jobName 任务名 + * @param cls 任务 + * @param date 具体执行时间点 + * @param params 传入的参数对 + * @Description: 延时一段时间后触发任务 + */ + void addJob(String jobName, Class cls, Date date, Map params); + + + /** + * @param jobName 任务名 + * @param cls 任务 + * @param amount 延时时间,单位 秒 + * @Description: 延时一段时间后触发任务 + */ + void addJob(String jobName, Class cls, int amount); + + /** + * @param jobName 任务名 + * @param cls 任务 + * @param amount 延时时间,单位 秒 + * @param params 传入的参数对 + * @Description: 延时一段时间后触发任务 + */ + void addJob(String jobName, Class cls, int amount, Map params); + + + /** + * @param jobName 任务名 + * @param cls 任务 + * @param cron 时间设置,cron表达式 + * @Description: 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名 + */ + void addJob(String jobName, Class cls, String cron); + + /** + * @param jobName 任务名 + * @param jobGroupName 任务组名 + * @param triggerName 触发器名 + * @param triggerGroupName 触发器组名 + * @param jobClass 任务 + * @param cron 时间设置,cron表达式 + * @Description: 添加一个定时任务 + */ + void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, Class jobClass, String cron); + + /** + * @param jobName + * @param cron + * @Description: 修改一个任务的触发时间(使用默认的任务组名 , 触发器名 , 触发器组名) + */ + void modifyJobTime(String jobName, String cron); + + + /** + * @param oldJobName :原任务名 + * @param jobName + * @param jobclass + * @param cron + * @Description:修改任务,(可以修改任务名,任务类,触发时间) + */ + void modifyJob(String oldJobName, String jobName, Class jobclass, String cron); + + + /** + * @param triggerName + * @param triggerGroupName + * @param cron + * @Description: 修改一个任务的触发时间 + */ + void modifyJobTime(String triggerName, String triggerGroupName, String cron); + + + /** + * @param jobName + * @Description 移除一个任务(使用默认的任务组名 , 触发器名 , 触发器组名) + */ + void removeJob(String jobName); + + /** + * @param jobName + * @param jobGroupName + * @param triggerName + * @param triggerGroupName + * @Description: 移除一个任务 + */ + void removeJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName); + + + /** + * @param jobName + * @Description:暂停一个任务(使用默认组名) + */ + void pauseJob(String jobName); + + /** + * @param jobName + * @param jobGroupName + * @Description:暂停一个任务 + */ + void pauseJob(String jobName, String jobGroupName); + + /** + * @Description:恢复所有任务 + */ + void resumeJob(); + + /** + * @param jobName + * @Description:恢复一个任务(使用默认组名) + */ + void resumeJob(String jobName); + + /** + * @param jobName + * @param jobGroupName + * @Description:恢复一个任务 + */ + void resumeJob(String jobName, String jobGroupName); + + /** + * @Description:启动所有定时任务 + */ + void startJobs(); + + /** + * @Description 关闭所有定时任务 + */ + void shutdownJobs(); + + /** + * @param jobName + * @Description: 立即运行任务,这里的立即运行,只会运行一次,方便测试时用。 + */ + void triggerJob(String jobName); + + /** + * @param jobName + * @param jobGroupName + * @Description: 立即运行任务,这里的立即运行,只会运行一次,方便测试时用。 + */ + void triggerJob(String jobName, String jobGroupName); + +} diff --git a/casic-quartz/src/main/java/com/casic/missiles/quartz/service/impl/QuartzManagerImpl.java b/casic-quartz/src/main/java/com/casic/missiles/quartz/service/impl/QuartzManagerImpl.java new file mode 100644 index 0000000..0bed2de --- /dev/null +++ b/casic-quartz/src/main/java/com/casic/missiles/quartz/service/impl/QuartzManagerImpl.java @@ -0,0 +1,390 @@ +package com.casic.missiles.quartz.service.impl; + +import com.casic.missiles.quartz.service.IQuartzManager; +import org.quartz.*; +import org.quartz.Trigger.TriggerState; +import org.quartz.impl.StdSchedulerFactory; +import org.quartz.impl.triggers.CronTriggerImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.Calendar; + +@Component +public class QuartzManagerImpl implements IQuartzManager { + + @Qualifier("scheduler") + @Autowired + private Scheduler sched; + + //private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory(); + private String JOB_GROUP_NAME = "MY_JOBGROUP_NAME"; + private String TRIGGER_GROUP_NAME = "MY_TRIGGERGROUP_NAME"; + + @SuppressWarnings({"rawtypes", "unchecked"}) + public void addJob(String jobName, Class cls, int amount) { + + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.SECOND, amount); + addJob(jobName, cls, calendar.getTime(), null); + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + public void addJob(String jobName, Class cls, int amount, Map params) { + + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.SECOND, amount); + addJob(jobName, cls, calendar.getTime(), params); + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + public void addJob(String jobName, Class cls, Date date) { + + addJob(jobName, cls, date, null); + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + public void addJob(String jobName, Class cls, Date date, Map params) { + try { + + //Scheduler sched = gSchedulerFactory.getScheduler(); + JobDetail job; + if(params != null){ + job = JobBuilder.newJob(cls) + .withIdentity(jobName, JOB_GROUP_NAME) + .usingJobData(new JobDataMap(params)) + .build(); + }else{ + job = JobBuilder.newJob(cls) + .withIdentity(jobName, JOB_GROUP_NAME) + .build(); + } + + + Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, TRIGGER_GROUP_NAME) + .startAt(date) + .withSchedule(SimpleScheduleBuilder.simpleSchedule()).build(); + + // 交给scheduler去调度 + sched.scheduleJob(job, trigger); + // 启动 + if (!sched.isShutdown()) { + sched.start(); + System.out.println("添加任务:" + jobName); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + @SuppressWarnings({"rawtypes", "unchecked"}) + public void addJob(String jobName, Class cls, String cron) { + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + JobDetail job = JobBuilder.newJob(cls).withIdentity(jobName, JOB_GROUP_NAME).build(); + // 表达式调度构建器 + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); + // 按新的cronExpression表达式构建一个新的trigger + Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, TRIGGER_GROUP_NAME) + .withSchedule(scheduleBuilder).build(); + + // 交给scheduler去调度 + sched.scheduleJob(job, trigger); + + // 启动 + if (!sched.isShutdown()) { + sched.start(); + System.out.println("添加任务:" + jobName); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + @SuppressWarnings({"rawtypes", "unchecked"}) + public void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, + Class jobClass, String cron) { + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + JobDetail job = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build(); + // 表达式调度构建器 + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); + // 按新的cronExpression表达式构建一个新的trigger + Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroupName) + .withSchedule(scheduleBuilder).build(); + sched.scheduleJob(job, trigger); + // 启动 + if (!sched.isShutdown()) { + sched.start(); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + public void modifyJobTime(String jobName, String cron) { + TriggerKey triggerKey = TriggerKey.triggerKey(jobName, TRIGGER_GROUP_NAME); + + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey); + if (trigger == null) { + return; + } + String oldTime = trigger.getCronExpression(); + if (!oldTime.equalsIgnoreCase(cron)) { + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); + // 按新的cronExpression表达式重新构建trigger + trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); + // 按新的trigger重新设置job执行 + sched.rescheduleJob(triggerKey, trigger); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + @SuppressWarnings({"rawtypes", "unchecked"}) + public void modifyJob(String oldJobName, String jobName, Class jobclass, String cron) { + /* + * removeJob(oldJobName); + * addJob(jobName, jobclass, cron); + * System.out.println("修改任务"+oldJobName); + */ + TriggerKey triggerKey = TriggerKey.triggerKey(oldJobName, TRIGGER_GROUP_NAME); + JobKey jobKey = JobKey.jobKey(oldJobName, JOB_GROUP_NAME); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + Trigger trigger = sched.getTrigger(triggerKey); + if (trigger == null) { + return; + } + sched.pauseTrigger(triggerKey);// 停止触发器 + sched.unscheduleJob(triggerKey);// 移除触发器 + sched.deleteJob(jobKey);// 删除任务 + System.out.println("移除任务:" + oldJobName); + + JobDetail job = JobBuilder.newJob(jobclass).withIdentity(jobName, JOB_GROUP_NAME).build(); + // 表达式调度构建器 + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); + // 按新的cronExpression表达式构建一个新的trigger + Trigger newTrigger = TriggerBuilder.newTrigger().withIdentity(jobName, TRIGGER_GROUP_NAME) + .withSchedule(scheduleBuilder).build(); + + // 交给scheduler去调度 + sched.scheduleJob(job, newTrigger); + + // 启动 + if (!sched.isShutdown()) { + sched.start(); + System.out.println("添加新任务:" + jobName); + } + System.out.println("修改任务【" + oldJobName + "】为:" + jobName); + } catch (Exception e) { + throw new RuntimeException(e); + } + + } + + + public void modifyJobTime(String triggerName, String triggerGroupName, String cron) { + TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey); + if (trigger == null) { + return; + } + String oldTime = trigger.getCronExpression(); + if (!oldTime.equalsIgnoreCase(cron)) { + // trigger已存在,则更新相应的定时设置 + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); + // 按新的cronExpression表达式重新构建trigger + trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); + // 按新的trigger重新设置job执行 + sched.resumeTrigger(trigger.getKey()); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + public void removeJob(String jobName) { + TriggerKey triggerKey = TriggerKey.triggerKey(jobName, TRIGGER_GROUP_NAME); + JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + Trigger trigger = sched.getTrigger(triggerKey); + if (trigger == null) { + return; + } + sched.pauseTrigger(triggerKey);// 停止触发器 + sched.unscheduleJob(triggerKey);// 移除触发器 + sched.deleteJob(jobKey);// 删除任务 + System.out.println("移除任务:" + jobName); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + public void removeJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName) { + TriggerKey triggerKey = TriggerKey.triggerKey(jobName, triggerGroupName); + JobKey jobKey = JobKey.jobKey(jobName, jobGroupName); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + sched.pauseTrigger(triggerKey);// 停止触发器 + sched.unscheduleJob(triggerKey);// 移除触发器 + sched.deleteJob(jobKey);// 删除任务 + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + public void pauseJob(String jobName) { + JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + sched.pauseJob(jobKey); + } catch (SchedulerException e) { + e.printStackTrace(); + } + } + + + public void pauseJob(String jobName, String jobGroupName) { + JobKey jobKey = JobKey.jobKey(jobName, jobGroupName); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + sched.pauseJob(jobKey); + } catch (SchedulerException e) { + e.printStackTrace(); + } + } + + public void resumeJob() { + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + List triggerGroups = sched.getTriggerGroupNames(); + //遍历获取每个触发器组 + for (int i = 0; i < triggerGroups.size(); i++) { + List triggers = sched.getTriggerGroupNames(); + //遍历每个触发器组 + for (int j = 0; j < triggers.size(); j++) { + sched.resumeJob(new JobKey(triggers.get(j), + triggerGroups.get(i))); + } + } + sched.start(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void resumeJob(String jobName) { + JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + sched.resumeJob(jobKey); + } catch (SchedulerException e) { + e.printStackTrace(); + } + } + + + public void resumeJob(String jobName, String jobGroupName) { + JobKey jobKey = JobKey.jobKey(jobName, jobGroupName); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + sched.resumeJob(jobKey); + } catch (SchedulerException e) { + e.printStackTrace(); + } + } + + + public void startJobs() { + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + sched.start(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + public void shutdownJobs() { + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + if (!sched.isShutdown()) { + sched.shutdown(); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + public void triggerJob(String jobName) { + JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + sched.triggerJob(jobKey); + } catch (SchedulerException e) { + e.printStackTrace(); + } + } + + + public void triggerJob(String jobName, String jobGroupName) { + JobKey jobKey = JobKey.jobKey(jobName, jobGroupName); + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + sched.triggerJob(jobKey); + } catch (SchedulerException e) { + e.printStackTrace(); + } + } + + + public String getTriggerState(String jobName) { + TriggerKey triggerKey = TriggerKey.triggerKey(jobName, TRIGGER_GROUP_NAME); + String name = null; + try { + //Scheduler sched = gSchedulerFactory.getScheduler(); + TriggerState triggerState = sched.getTriggerState(triggerKey); + name = triggerState.name(); + } catch (SchedulerException e) { + e.printStackTrace(); + } + return name; + } + + + public List getRecentTriggerTime(String cron) { + List list = new ArrayList(); + try { + CronTriggerImpl cronTriggerImpl = new CronTriggerImpl(); + cronTriggerImpl.setCronExpression(cron); + List dates = TriggerUtils.computeFireTimes(cronTriggerImpl, null, 8); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + for (Date date : dates) { + list.add(dateFormat.format(date)); + } + + } catch (ParseException e) { + e.printStackTrace(); + } + return list; + } +} \ No newline at end of file diff --git a/casic-web/src/main/resources/quartz.properties b/casic-web/src/main/resources/quartz.properties new file mode 100644 index 0000000..429d117 --- /dev/null +++ b/casic-web/src/main/resources/quartz.properties @@ -0,0 +1,14 @@ +org.quartz.scheduler.instanceName = MyScheduler +org.quartz.threadPool.threadCount = 5 +org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX +org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate +org.quartz.jobStore.tablePrefix = QRTZ_ +org.quartz.jobStore.dataSource = myDS + +org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver +org.quartz.dataSource.myDS.URL = jdbc:mysql://111.198.10.15:11102/quartz?useSSL=false&serverTimezone=UTC +org.quartz.dataSource.myDS.user = root +org.quartz.dataSource.myDS.password = Casic203! +org.quartz.dataSource.myDS.maxConnections = 8 +org.quartz.dataSource.myDS.validationQuery = select 0 from dual +#org.quartz.dataSource.myDS.discardIdleConnectionsSeconds = 60 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 65fda33..7e66891 100644 --- a/pom.xml +++ b/pom.xml @@ -12,6 +12,7 @@ casic-station casic-data casic-common + casic-quartz com.casic