springboot-quartz单表CURD
细看研究,请观看
https://www.w3cschool.cn/quartz_doc/quartz_doc-jop62d45.html
QuartzManager.java
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.cxx.cebc.component; import com.cxx.cebc.entity.QuartzDetailVO; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; import org.springframework.stereotype.Component; @Component public class QuartzManager { private String JOB_GROUP_NAME = "CEBC_JOBGROUP_NAME"; //任务组名 private String TRIGGER_GROUP_NAME = "CEBC_TRIGGERGROUP_NAME"; //触发器名 public void addJob(String className, String jobGroupName, String jobName, String cron) { try { Class clazzName = Class.forName(className); // 任务名,任务组,任务执行类 JobDetail jobDetail = JobBuilder.newJob(clazzName).withIdentity(jobName, JOB_GROUP_NAME).build(); // 触发器 TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger(); // 触发器名,触发器组 triggerBuilder.withIdentity(jobName, TRIGGER_GROUP_NAME); triggerBuilder.startNow(); // 触发器时间设定 triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron)); // 创建Trigger对象 CronTrigger trigger = (CronTrigger) triggerBuilder.build(); Scheduler myScheduler = StdSchedulerFactory.getDefaultScheduler(); // 调度容器设置JobDetail和Trigger myScheduler.scheduleJob(jobDetail, trigger); // 启动 if (!myScheduler.isShutdown()) { myScheduler.start(); } } catch (Exception e) { throw new RuntimeException(e); } } public void deleteJob(QuartzDetailVO quartzDetailVO) { try{ Scheduler myScheduler = StdSchedulerFactory.getDefaultScheduler(); TriggerKey triggerKey = TriggerKey.triggerKey(quartzDetailVO.getJobName(), TRIGGER_GROUP_NAME); // 停止触发器 myScheduler.pauseTrigger(triggerKey); // 移除触发器 myScheduler.unscheduleJob(triggerKey); // 删除任务 myScheduler.deleteJob(JobKey.jobKey(quartzDetailVO.getJobName(), JOB_GROUP_NAME)); } catch (Exception e) { throw new RuntimeException(e); } } }
SpringContextUtils.java
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.cxx.cebc.component; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; @Component public class SpringContextUtils implements ApplicationContextAware { /** * 上下文对象实例 */ private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } /** * 获取applicationContext */ public static ApplicationContext getApplicationContext() { return applicationContext; } /** * 通过name获取 Bean. */ public static Object getBean(String name) { return getApplicationContext().getBean(name); } /** * 通过class获取Bean. */ public static <T> T getBean(Class<T> clazz) { return getApplicationContext().getBean(clazz); } /** * 通过name,以及Clazz返回指定的Bean */ public static <T> T getBean(String name, Class<T> clazz) { return getApplicationContext().getBean(name, clazz); } }
MyWebMvcConfigurer.java
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.cxx.cebc.configuration; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class MyWebMvcConfigurer implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("jobIndex"); } //访问外部文件 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("doc.html") .addResourceLocations("classpath:/META-INF/resources/"); //springboot 集成swagger2.2后静态资源404,添加如下两行配置 registry.addResourceHandler("/**") .addResourceLocations("classpath:/static/"); } //注册拦截器 @Override public void addInterceptors(InterceptorRegistry registry) { System.out.println("MyWebMvcConfigurer addInterceptors"); //springboot已经做好了静态资源映射了 //registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**").excludePathPatterns("/loginForm", "/", "/login", "/css/**", "/js/**", "/images/**"); } }
SwaggerConfig.java
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.cxx.cebc.configuration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; @Configuration @EnableSwagger2 public class SwaggerConfig { //http://localhost:8080/doc.html, http://localhost:8080/swagger-ui.html @Bean public Docket api(){ return new Docket(DocumentationType.SWAGGER_2) .apiInfo(getApiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.cxx.cebc.controller")) .paths(PathSelectors.any()) .build(); } private ApiInfo getApiInfo(){ return new ApiInfoBuilder() .title("Swagger2....") .description("Swagger2") .version("1.0") .license("Apache 2.0") .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0") .build(); } }
HtmlController.java
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.cxx.cebc.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @Api(value = "HtmlController") @Controller public class HtmlController { @ApiOperation(value = "goto", notes = "") @GetMapping(value = "/goto/{name}") public String gotoHtml(@PathVariable(name = "name") String name) { System.out.println("111111111111"); return name; } }
JobController.java
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.cxx.cebc.controller; import com.cxx.cebc.component.QuartzManager; import com.cxx.cebc.entity.LayuiTable; import com.cxx.cebc.entity.QuartzDetailVO; import com.cxx.cebc.services.QuartzDetailService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.annotation.PostConstruct; import java.util.List; @Api(value = "JobController") @RestController @RequestMapping("/task") public class JobController { @Autowired private QuartzManager quartzManager; @Autowired private QuartzDetailService quartzDetailService; @PostConstruct public void initTaskData() { List<QuartzDetailVO> datas = quartzDetailService.getAllJob(); for (QuartzDetailVO quartzDetailVO : datas) { if ("1".equals(quartzDetailVO.getStatus())) { quartzManager.addJob(quartzDetailVO.getClassName(), quartzDetailVO.getJobGroupName(), quartzDetailVO.getJobName(), quartzDetailVO.getCron()); } } } @ApiOperation(value = "startTask", notes = "启动") @GetMapping(value = "/startTask") public String startTask(@RequestParam String id) { QuartzDetailVO quartzDetailVO = quartzDetailService.selectByPrimaryKey(Integer.parseInt(id)); //启动 quartzManager.addJob(quartzDetailVO.getClassName(), quartzDetailVO.getJobGroupName(), quartzDetailVO.getJobName(), quartzDetailVO.getCron()); //更新状态 quartzDetailVO.setStatus("1"); quartzDetailService.updateByPrimaryKey(quartzDetailVO); return "启动成功"; } @ApiOperation(value = "stopTask", notes = "停止") @GetMapping(value = "/stopTask") public String stopTask(@RequestParam String id) { QuartzDetailVO quartzDetailVO = quartzDetailService.selectByPrimaryKey(Integer.parseInt(id)); //停止 quartzManager.deleteJob(quartzDetailVO); //更新状态 quartzDetailVO.setStatus("0"); quartzDetailService.updateByPrimaryKey(quartzDetailVO); return "停止成功"; } @ApiOperation(value = "updateTask", notes = "修改") @PostMapping(value = "/updateTask") public String updateTask(@RequestBody QuartzDetailVO quartzDetailVO) { //删除 quartzManager.deleteJob(quartzDetailVO); //重新添加 quartzManager.addJob(quartzDetailVO.getClassName(), quartzDetailVO.getJobGroupName(), quartzDetailVO.getJobName(), quartzDetailVO.getCron()); //重新修改数据 quartzDetailService.updateByPrimaryKey(quartzDetailVO); return "修改成功"; } @ApiOperation(value = "deleteTask", notes = "删除") @GetMapping(value = "/deleteTask") public String deleteTask(@RequestParam String id) { QuartzDetailVO quartzDetailVO = quartzDetailService.selectByPrimaryKey(Integer.parseInt(id)); //删除 quartzManager.deleteJob(quartzDetailVO); //删除任务 quartzDetailService.deleteByPrimaryKey(quartzDetailVO.getId()); return "删除成功"; } @ApiOperation(value = "queryTask", notes = "查询") @GetMapping(value = "/queryTask") public LayuiTable queryTask(@RequestParam(required = false, defaultValue = "1") int page, @RequestParam(required = false, defaultValue = "15") int limit) { List<QuartzDetailVO> datas = quartzDetailService.getAllJob(); return LayuiTable.tableData(datas == null ? 0 : datas.size(), datas); } @ApiOperation(value = "addTask", notes = "添加") @PostMapping(value = "/addTask") public String addTask(@RequestBody QuartzDetailVO quartzDetailVO) { int id = quartzDetailService.addJob(quartzDetailVO); return "添加成功"; } }
QuartzDetailVO.java
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.cxx.cebc.entity; import java.io.Serializable; import java.util.Date; import lombok.Data; /** * quartz_detail * @author */ @Data public class QuartzDetailVO implements Serializable { private Integer id; private String className; private String jobGroupName; private String jobName; private String cron; private String status; private Date createTime; private static final long serialVersionUID = 1L; }
LayuiTable.java
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.cxx.cebc.entity; import java.util.HashMap; import java.util.List; public class LayuiTable extends HashMap<String,Object> { private static final long serialVersionUID = 1L; public static LayuiTable tableData(Integer count, List<?> data){ LayuiTable tableData = new LayuiTable(); tableData.put("code", 0); tableData.put("msg", ""); tableData.put("count", count); tableData.put("data", data); return tableData; } }
QuartEarlyJob.java, QuartNightJob.java
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Application.java
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
application.properties
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
server.port=8080 spring.datasource.url=jdbc:mysql://localhost:3306/quartz?characterEncoding=UTF-8&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #mapper-locations=classpath*:mapper/*.xml spring.devtools.restart.enabled=true spring.devtools.restart.addtitional-paths=src/main/java spring.devtools.restart.exclude=WEB-INF/** spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.check-template-location=true spring.thymeleaf.suffix=.html spring.thymeleaf.mode=HTML5 spring.thymeleaf.encoding=UTF-8 spring.thymeleaf.content-type=text/html spring.thymeleaf.cache=false
jobIndex.html, index.js
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Layui</title> <meta name="renderer" content="webkit"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <link rel="shortcut icon" href="#"/> <link rel="stylesheet" href="/layui-v2.5.6/layui/css/layui.css" media="all"> <!-- 注意:如果你直接复制所有代码到本地,上述css路径需要改成你本地的 --> </head> <body> <div style="width: 80%; margin: 0px auto;"> <table class="layui-hide" id="test" lay-filter="test"></table> </div> <script type="text/html" id="toolbarDemo"> <div class="layui-btn-container"> <button class="layui-btn layui-btn-sm" lay-event="getCheckData">获取选中行数据</button> <button class="layui-btn layui-btn-sm" lay-event="getCheckLength">获取选中数目</button> <button class="layui-btn layui-btn-sm" lay-event="isAll">验证是否全选</button> </div> </script> <script type="text/html" id="barDemo"> {{# if(d.status === '0'){ }} <a class="layui-btn layui-btn-xs" lay-event="start">启动</a> <a class="layui-btn layui-btn-xs layui-btn-disabled" lay-event="stop">停止</a> {{# } else { }} <a class="layui-btn layui-btn-xs layui-btn-disabled" lay-event="start">启动</a> <a class="layui-btn layui-btn-xs" lay-event="stop">停止</a> {{# } }} <a class="layui-btn layui-btn-xs" lay-event="edit">修改</a> <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a> </script> <script src="/js/jquery-3.2.1.min.js"></script> <script src="/layui-v2.5.6/layui/layui.js"></script> <script src="/js/job.js"></script> </body> </html>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
$(document).ready(function () { refreshData(); }); function refreshData() { layui.use('table', function () { var table = layui.table; table.render({ elem: '#test' , url: '/task/queryTask' , toolbar: '#toolbarDemo' //开启头部工具栏,并为其绑定左侧模板 , defaultToolbar: ['filter', 'exports', 'print', { //自定义头部工具栏右侧图标。如无需自定义,去除该参数即可 title: '提示' , layEvent: 'LAYTABLE_TIPS' , icon: 'layui-icon-tips' }] , title: '用户数据表' , cols: [[ {type: 'checkbox', fixed: 'left'} , {field: 'className', title: '类名称', width: '20%'} , {field: 'jobGroupName', title: '任务分组名称', width: '15%', edit: 'text'} , {field: 'jobName', title: '任务名', width: '15%', edit: 'text', sort: true} , {field: 'cron', title: '表达式', width: '10%', edit: 'text'} , { field: 'status', title: '状态', width: '10%', templet: function (d) { return d.status == '0' ? '未启动' : '已启动'; } } , {fixed: 'right', title: '操作', width: '20%', toolbar: '#barDemo'} ]] , page: true }); //头工具栏事件 table.on('toolbar(test)', function (obj) { var checkStatus = table.checkStatus(obj.config.id); switch (obj.event) { case 'getCheckData': var data = checkStatus.data; layer.alert(JSON.stringify(data)); break; case 'getCheckLength': var data = checkStatus.data; layer.msg('选中了:' + data.length + ' 个'); break; case 'isAll': layer.msg(checkStatus.isAll ? '全选' : '未全选'); break; //自定义头工具栏右侧图标 - 提示 case 'LAYTABLE_TIPS': layer.alert('这是工具栏右侧自定义的一个图标按钮'); break; } ; }); //监听行工具事件 table.on('tool(test)', function (obj) { var data = obj.data; //console.log(obj) if (obj.event == 'start') { startTask(obj); } else if (obj.event == 'stop') { stopTask(obj); } else if (obj.event == 'edit') { updateData(obj); } else if (obj.event == 'del') { layer.confirm('真的删除行么', function (index) { deleteData(obj); layer.close(index); }); } }); }); } function startTask(obj) { $.ajax({ url: '/task/startTask', data: {"id": obj.data.id}, success: function (ret) { $(".layui-laypage-btn").click(); obj.update({"status": "1"}); layer.alert(ret); }, error: function () { } }) } function stopTask(obj) { $.ajax({ url: '/task/stopTask', data: {"id": obj.data.id}, success: function () { $(".layui-laypage-btn").click(); obj.update({"status": "0"}); layer.alert(ret); }, error: function () { } }) } function deleteData(obj) { $.ajax({ url: '/task/deleteTask', data: {"id": obj.data.id}, success: function () { obj.del(); }, error: function () { } }) } function updateData(obj) { $.ajax({ url: '/task/updateTask', type: 'post', contentType: 'application/json', data: JSON.stringify(obj.data), success: function (ret) { layer.alert(ret); //obj.update({"cron": "0"}); }, error: function () { } }) }
脚本
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
-- auto-generated definition create table quartz_detail ( ID int auto_increment primary key, CLASS_NAME varchar(50) null, JOB_GROUP_NAME varchar(50) null, JOB_NAME varchar(50) null, CRON varchar(50) null, STATUS varchar(2) null, CREATE_TIME timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP );