springboot-quartz单表CURD

细看研究,请观看

https://www.w3cschool.cn/quartz_doc/quartz_doc-jop62d45.html

 

QuartzManager.java
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);
        }
    }


}
View Code
SpringContextUtils.java
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);
    }
}
View Code
MyWebMvcConfigurer.java
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/**");
    }


}
View Code
SwaggerConfig.java
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();
    }


}
View Code
HtmlController.java
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;
    }
}
View Code

JobController.java

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 "添加成功";
    }

}
View Code

QuartzDetailVO.java

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;
}
View Code

LayuiTable.java

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

}
View Code

QuartEarlyJob.java, QuartNightJob.java

View Code

Application.java

View Code

application.properties

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
View Code

jobIndex.html, index.js

<!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>
View Code
$(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 () {

        }
    })
}
View Code

脚本

-- 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
);
View Code


posted @ 2020-09-28 23:05  chenxiangxiang  阅读(301)  评论(0编辑  收藏  举报