Full Code of gui66497/spring-quartz-demo for AI

master 9cd0b3896bab cached
25 files
57.3 KB
15.5k tokens
105 symbols
1 requests
Download .txt
Repository: gui66497/spring-quartz-demo
Branch: master
Commit: 9cd0b3896bab
Files: 25
Total size: 57.3 KB

Directory structure:
gitextract_9rz2okf2/

├── README.md
├── doc/
│   └── init.sql
├── pom.xml
└── src/
    └── main/
        ├── java/
        │   └── com/
        │       └── dexcoder/
        │           └── demo/
        │               ├── controller/
        │               │   └── ScheduleJobController.java
        │               ├── event/
        │               │   └── ScheduleJobInit.java
        │               ├── exceptions/
        │               │   └── ScheduleException.java
        │               ├── model/
        │               │   └── ScheduleJob.java
        │               ├── quartz/
        │               │   ├── JobFactory.java
        │               │   ├── JobFactoryConfiguration.java
        │               │   └── JobSyncFactory.java
        │               ├── service/
        │               │   ├── ScheduleJobService.java
        │               │   └── impl/
        │               │       └── ScheduleJobServiceImpl.java
        │               ├── utils/
        │               │   ├── FutureLinsener.java
        │               │   └── ScheduleUtils.java
        │               └── vo/
        │                   └── ScheduleJobVo.java
        ├── resources/
        │   ├── applicationContext.xml
        │   ├── init.properties
        │   ├── log4j.xml
        │   ├── spring-mvc.xml
        │   ├── spring-quartz.xml
        │   └── velocity.properties
        └── webapp/
            ├── WEB-INF/
            │   ├── input-schedule-job.vm
            │   ├── list-schedule-job.vm
            │   └── web.xml
            └── index.jsp

================================================
FILE CONTENTS
================================================

================================================
FILE: README.md
================================================
## spring-quartz-demo
## 功能
spring整合quartz动态定时任务demo,实现对定时任务的创建、删除、暂停、恢复,以及一个列表展示控制页面。
## 使用 
先找到项目根目录/doc/init.sql初始化数据库并修改init.properties文件中的数据库配置信息
部署到Tomcat后浏览器直接输入http://localhost:8080 即可
## 界面
![avatar](http://cdn.guitang.fun/OH3U3N_%28B17DRTJXYX%5B12OD.png)


================================================
FILE: doc/init.sql
================================================
DROP TABLE IF EXISTS schedule_job;
CREATE TABLE schedule_job(
schedule_job_id BIGINT(20) NOT NULL auto_increment,
job_name varchar(255) DEFAULT NULL,
alias_name varchar(255) DEFAULT NULL,
job_group varchar(255) DEFAULT NULL,
job_trigger varchar(255) DEFAULT NULL,
status varchar(255) DEFAULT NULL,
cron_expression varchar(255) DEFAULT NULL,
is_sync VARCHAR(1) NOT NULL,
description VARCHAR(255) DEFAULT NULL,
gmt_create timestamp NULL DEFAULT NULL,
gmt_modify timestamp NULL DEFAULT NULL,
PRIMARY KEY (schedule_job_id)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

================================================
FILE: pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.dexcoder</groupId>
  <artifactId>spring-quartz-demo</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <commons.dbcp.version>1.4</commons.dbcp.version>
    <mysql.version>5.1.25</mysql.version>
    <spring.version>4.1.0.RELEASE</spring.version>
    <quartz.version>2.2.1</quartz.version>
    <aspectj.version>1.7.2</aspectj.version>
    <cglib.version>2.2.2</cglib.version>
    <junit.version>4.7</junit.version>
    <velocity.version>1.6.2</velocity.version>
    <velocity-tools.version>2.0</velocity-tools.version>
    <commons-lang.version>2.5</commons-lang.version>
    <commons-io.version>2.2</commons-io.version>
    <commons-fileupload.version>1.3.3</commons-fileupload.version>
    <jackson-mapper-asl.version>1.9.13</jackson-mapper-asl.version>
    <jsoup.version>1.7.3</jsoup.version>
    <slf4j-log4j12.version>1.6.6</slf4j-log4j12.version>
    <commons-collections.version>3.2.1</commons-collections.version>
    <commons-beanutils.version>1.8.3</commons-beanutils.version>
    <jodd-mail.version>3.4.10</jodd-mail.version>
    <ikanalyzer.version>2012-u6</ikanalyzer.version>
    <commons-codec.version>1.5</commons-codec.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>com.dexcoder</groupId>
      <artifactId>dexcoder-dal-spring</artifactId>
      <version>2.3.1</version>
      <exclusions>
        <exclusion>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jdbc</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>com.dexcoder</groupId>
      <artifactId>dexcoder-assistants</artifactId>
      <version>1.0.0</version>
      <scope>system</scope>
      <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/dexcoder-assistants-1.0.0.jar</systemPath>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>${mysql.version}</version>
    </dependency>
    <dependency>
      <groupId>commons-dbcp</groupId>
      <artifactId>commons-dbcp</artifactId>
      <version>${commons.dbcp.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-expression</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!--<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-asm</artifactId>
      <version>${spring.version}</version>
    </dependency>-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>${aspectj.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.velocity</groupId>
      <artifactId>velocity</artifactId>
      <version>${velocity.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.velocity</groupId>
      <artifactId>velocity-tools</artifactId>
      <version>${velocity-tools.version}</version>
    </dependency>
    <dependency>
      <groupId>commons-lang</groupId>
      <artifactId>commons-lang</artifactId>
      <version>${commons-lang.version}</version>
    </dependency>
    <dependency>
      <groupId>org.quartz-scheduler</groupId>
      <artifactId>quartz</artifactId>
      <version>${quartz.version}</version>
    </dependency>
    <dependency>
      <groupId>commons-codec</groupId>
      <artifactId>commons-codec</artifactId>
      <version>${commons-codec.version}</version>
    </dependency>
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>${commons-fileupload.version}</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>${slf4j-log4j12.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-oxm</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.7</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>19.0</version>
    </dependency>
  </dependencies>


</project>


================================================
FILE: src/main/java/com/dexcoder/demo/controller/ScheduleJobController.java
================================================
package com.dexcoder.demo.controller;

import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.dexcoder.demo.service.ScheduleJobService;
import com.dexcoder.demo.vo.ScheduleJobVo;

/**
 * Created by liyd on 2015/4/3.
 */
@Controller
public class ScheduleJobController {

    /** job service */
    @Autowired
    private ScheduleJobService scheduleJobService;

    /**
     * 任务页面
     *
     * @return
     */
    @RequestMapping(value = "input-schedule-job", method = RequestMethod.GET)
    public String inputScheduleJob(ScheduleJobVo scheduleJobVo, ModelMap modelMap) {

        if (scheduleJobVo.getScheduleJobId() != null) {
            ScheduleJobVo scheduleJob = scheduleJobService.get(scheduleJobVo.getScheduleJobId());
            scheduleJob.setKeywords(scheduleJobVo.getKeywords());
            modelMap.put("scheduleJobVo", scheduleJob);
        }

        return "input-schedule-job";
    }

    /**
     * 删除任务
     *
     * @return
     */
    @RequestMapping(value = "delete-schedule-job", method = RequestMethod.GET)
    public String deleteScheduleJob(Long scheduleJobId) {

        scheduleJobService.delete(scheduleJobId);

        return "redirect:list-schedule-job.shtml";
    }

    /**
     * 运行一次
     *
     * @return
     */
    @RequestMapping(value = "run-once-schedule-job", method = RequestMethod.GET)
    public String runOnceScheduleJob(Long scheduleJobId) {

        scheduleJobService.runOnce(scheduleJobId);

        return "redirect:list-schedule-job.shtml";
    }

    /**
     * 暂停
     *
     * @return
     */
    @RequestMapping(value = "pause-schedule-job", method = RequestMethod.GET)
    public String pauseScheduleJob(Long scheduleJobId) {
        scheduleJobService.pauseJob(scheduleJobId);
        return "redirect:list-schedule-job.shtml";
    }

    /**
     * 恢复
     *
     * @return
     */
    @RequestMapping(value = "resume-schedule-job", method = RequestMethod.GET)
    public String resumeScheduleJob(Long scheduleJobId) {
        scheduleJobService.resumeJob(scheduleJobId);
        return "redirect:list-schedule-job.shtml";
    }

    /**
     * 保存任务
     *
     * @param scheduleJobVo
     * @return
     */
    @RequestMapping(value = "save-schedule-job", method = RequestMethod.POST)
    public String saveScheduleJob(ScheduleJobVo scheduleJobVo) {

        //测试用随便设个状态
        scheduleJobVo.setStatus("1");

        if (scheduleJobVo.getScheduleJobId() == null) {
            scheduleJobService.insert(scheduleJobVo);
        } else if (StringUtils.equalsIgnoreCase(scheduleJobVo.getKeywords(),"delUpdate")){
            //直接拿keywords存一下,就不另外重新弄了
            scheduleJobService.delUpdate(scheduleJobVo);
        }else {
            scheduleJobService.update(scheduleJobVo);
        }
        return "redirect:list-schedule-job.shtml";
    }

    /**
     * 任务列表页
     *
     * @param modelMap
     * @return
     */
    @RequestMapping(value = "list-schedule-job", method = RequestMethod.GET)
    public String listScheduleJob(ScheduleJobVo scheduleJobVo, ModelMap modelMap) {

        List<ScheduleJobVo> scheduleJobVoList = scheduleJobService.queryList(scheduleJobVo);
        modelMap.put("scheduleJobVoList", scheduleJobVoList);

        List<ScheduleJobVo> executingJobList = scheduleJobService.queryExecutingJobList();
        modelMap.put("executingJobList", executingJobList);

        return "list-schedule-job";
    }

}


================================================
FILE: src/main/java/com/dexcoder/demo/event/ScheduleJobInit.java
================================================
package com.dexcoder.demo.event;

import javax.annotation.PostConstruct;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.dexcoder.demo.service.ScheduleJobService;

/**
 * 定时任务初始化
 *
 * Created by liyd on 12/19/14.
 */
@Component
public class ScheduleJobInit {

    /** 日志对象 */
    private static final Logger LOG = LoggerFactory.getLogger(ScheduleJobInit.class);

    /** 定时任务service */
    @Autowired
    private ScheduleJobService  scheduleJobService;

    /**
     * 项目启动时初始化
     */
    @PostConstruct
    public void init() {

        if (LOG.isInfoEnabled()) {
            LOG.info("init");
        }

        scheduleJobService.initScheduleJob();

        if (LOG.isInfoEnabled()) {
            LOG.info("end");
        }
    }

}


================================================
FILE: src/main/java/com/dexcoder/demo/exceptions/ScheduleException.java
================================================
package com.dexcoder.demo.exceptions;

import com.dexcoder.commons.exceptions.DexcoderException;

/**
 * 自定义异常
 * 
 * Created by liyd on 12/19/14.
 */
public class ScheduleException extends DexcoderException {

    /** serialVersionUID */
    private static final long serialVersionUID = -1921648378954132894L;

    /**
     * Instantiates a new ScheduleException.
     *
     * @param e the e
     */
    public ScheduleException(Throwable e) {
        super(e);
    }

    /**
     * Constructor
     *
     * @param message the message
     */
    public ScheduleException(String message) {
        super(message);
    }

    /**
     * Constructor
     *
     * @param code the code
     * @param message the message
     */
    public ScheduleException(String code, String message) {
        super(code, message);
    }
}


================================================
FILE: src/main/java/com/dexcoder/demo/model/ScheduleJob.java
================================================
package com.dexcoder.demo.model;

import java.util.Date;

import com.dexcoder.commons.pager.Pageable;

/**
 * 计划任务信息
 * 
 * User: liyd
 * Date: 14-1-3
 * Time: 上午10:24
 */
public class ScheduleJob extends Pageable {

    private static final long serialVersionUID = 4888005949821878223L;

    /** 任务id */
    private Long              scheduleJobId;

    /** 任务名称 */
    private String            jobName;

    /** 任务别名 */
    private String            aliasName;

    /** 任务分组 */
    private String            jobGroup;

    /** 触发器 */
    private String            jobTrigger;

    /** 任务状态 */
    private String            status;

    /** 任务运行时间表达式 */
    private String            cronExpression;

    /** 是否异步 */
    private Boolean           isSync;

    /** 任务描述 */
    private String            description;

    /** 创建时间 */
    private Date              gmtCreate;

    /** 修改时间 */
    private Date              gmtModify;

    public Long getScheduleJobId() {
        return scheduleJobId;
    }

    public void setScheduleJobId(Long scheduleJobId) {
        this.scheduleJobId = scheduleJobId;
    }

    public String getJobName() {
        return jobName;
    }

    public void setJobName(String jobName) {
        this.jobName = jobName;
    }

    public String getAliasName() {
        return aliasName;
    }

    public void setAliasName(String aliasName) {
        this.aliasName = aliasName;
    }

    public String getJobGroup() {
        return jobGroup;
    }

    public void setJobGroup(String jobGroup) {
        this.jobGroup = jobGroup;
    }

    public String getJobTrigger() {
        return jobTrigger;
    }

    public void setJobTrigger(String jobTrigger) {
        this.jobTrigger = jobTrigger;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getCronExpression() {
        return cronExpression;
    }

    public void setCronExpression(String cronExpression) {
        this.cronExpression = cronExpression;
    }

    public Boolean getIsSync() {
        return isSync;
    }

    public void setIsSync(Boolean isSync) {
        this.isSync = isSync;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Date getGmtCreate() {
        return gmtCreate;
    }

    public void setGmtCreate(Date gmtCreate) {
        this.gmtCreate = gmtCreate;
    }

    public Date getGmtModify() {
        return gmtModify;
    }

    public void setGmtModify(Date gmtModify) {
        this.gmtModify = gmtModify;
    }
}


================================================
FILE: src/main/java/com/dexcoder/demo/quartz/JobFactory.java
================================================
package com.dexcoder.demo.quartz;

import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.dexcoder.demo.model.ScheduleJob;
import com.dexcoder.demo.vo.ScheduleJobVo;

/**
 * 任务工厂类,非同步(相同定义的jobdetail会等待前一任务执行完毕后才执行下一个)
 *
 * User: liyd
 * Date: 14-1-3
 * Time: 上午10:11
 */
@DisallowConcurrentExecution
public class JobFactory implements Job {

    /* 日志对象 */
    private static final Logger LOG = LoggerFactory.getLogger(JobFactory.class);

    public void execute(JobExecutionContext context) throws JobExecutionException {

        LOG.info("JobFactory execute");

        ScheduleJob scheduleJob = (ScheduleJob) context.getMergedJobDataMap().get(
            ScheduleJobVo.JOB_PARAM_KEY);

        System.out.println("jobName:" + scheduleJob.getJobName() + "  " + scheduleJob);

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}


================================================
FILE: src/main/java/com/dexcoder/demo/quartz/JobFactoryConfiguration.java
================================================
package com.dexcoder.demo.quartz;

import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;

/**
 * JobFactoryConfiguration
 *
 * @author fgt
 * @version 2016/12/12 21:13
 */
public class JobFactoryConfiguration extends AdaptableJobFactory {

    @Autowired
    AutowireCapableBeanFactory capableBeanFactory;

    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {

        /**
         * 这里覆盖了super的createJobInstance方法,对其创建出来的类再进行autowire。
         */
        Object jobInstance = super.createJobInstance(bundle);
        //进行注入
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }
}


================================================
FILE: src/main/java/com/dexcoder/demo/quartz/JobSyncFactory.java
================================================
package com.dexcoder.demo.quartz;

import com.dexcoder.demo.service.ScheduleJobService;
import org.quartz.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.dexcoder.demo.model.ScheduleJob;
import com.dexcoder.demo.vo.ScheduleJobVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 同步的任务工厂类
 *
 * Created by liyd on 12/19/14.
 */
@Component
public class JobSyncFactory implements Job {

    @Autowired
    private ScheduleJobService scheduleJobService;

    /* 日志对象 */
    private static final Logger LOG = LoggerFactory.getLogger(JobSyncFactory.class);

    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

        LOG.info("JobSyncFactory execute");

        JobDataMap mergedJobDataMap = jobExecutionContext.getMergedJobDataMap();
        ScheduleJob scheduleJob = (ScheduleJob) mergedJobDataMap.get(ScheduleJobVo.JOB_PARAM_KEY);

        System.out.println("jobName:" + scheduleJob.getJobName() + "  " + scheduleJob);

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}


================================================
FILE: src/main/java/com/dexcoder/demo/service/ScheduleJobService.java
================================================
package com.dexcoder.demo.service;

import java.util.List;

import com.dexcoder.demo.model.ScheduleJob;
import com.dexcoder.demo.vo.ScheduleJobVo;

/**
 * 定时任务service
 *
 * Created by liyd on 12/19/14.
 */
public interface ScheduleJobService {

    /**
     * 初始化定时任务
     */
    public void initScheduleJob();

    /**
     * 新增
     * 
     * @param scheduleJobVo
     * @return
     */
    public Long insert(ScheduleJobVo scheduleJobVo);

    /**
     * 直接修改 只能修改运行的时间,参数、同异步等无法修改
     * 
     * @param scheduleJobVo
     */
    public void update(ScheduleJobVo scheduleJobVo);

    /**
     * 删除重新创建方式
     * 
     * @param scheduleJobVo
     */
    public void delUpdate(ScheduleJobVo scheduleJobVo);

    /**
     * 删除
     * 
     * @param scheduleJobId
     */
    public void delete(Long scheduleJobId);

    /**
     * 运行一次任务
     *
     * @param scheduleJobId the schedule job id
     * @return
     */
    public void runOnce(Long scheduleJobId);

    /**
     * 暂停任务
     *
     * @param scheduleJobId the schedule job id
     * @return
     */
    public void pauseJob(Long scheduleJobId);

    /**
     * 恢复任务
     *
     * @param scheduleJobId the schedule job id
     * @return
     */
    public void resumeJob(Long scheduleJobId);

    /**
     * 获取任务对象
     * 
     * @param scheduleJobId
     * @return
     */
    public ScheduleJobVo get(Long scheduleJobId);

    /**
     * 查询任务列表
     * 
     * @param scheduleJobVo
     * @return
     */
    public List<ScheduleJobVo> queryList(ScheduleJobVo scheduleJobVo);

    /**
     * 获取运行中的任务列表
     *
     * @return
     */
    public List<ScheduleJobVo> queryExecutingJobList();

}


================================================
FILE: src/main/java/com/dexcoder/demo/service/impl/ScheduleJobServiceImpl.java
================================================
package com.dexcoder.demo.service.impl;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.dexcoder.commons.bean.BeanConverter;
import com.dexcoder.dal.JdbcDao;
import com.dexcoder.dal.build.Criteria;
import com.dexcoder.demo.model.ScheduleJob;
import com.dexcoder.demo.service.ScheduleJobService;
import com.dexcoder.demo.utils.ScheduleUtils;
import com.dexcoder.demo.vo.ScheduleJobVo;

/**
 * 定时任务
 *
 * Created by liyd on 12/19/14.
 */
@Service
public class ScheduleJobServiceImpl implements ScheduleJobService {

    /** 调度工厂Bean */
    @Autowired
    private Scheduler scheduler;

    /** 通用dao */
    @Autowired
    private JdbcDao   jdbcDao;

    public void initScheduleJob() {
        List<ScheduleJob> scheduleJobList = jdbcDao.queryList(Criteria.select(ScheduleJob.class));
        if (CollectionUtils.isEmpty(scheduleJobList)) {
            return;
        }
        for (ScheduleJob scheduleJob : scheduleJobList) {

            CronTrigger cronTrigger = ScheduleUtils.getCronTrigger(scheduler, scheduleJob.getJobName(),
                scheduleJob.getJobGroup());

            //不存在,创建一个
            if (cronTrigger == null) {
                ScheduleUtils.createScheduleJob(scheduler, scheduleJob);
            } else {
                //已存在,那么更新相应的定时设置
                ScheduleUtils.updateScheduleJob(scheduler, scheduleJob);
            }
        }
    }

    public Long insert(ScheduleJobVo scheduleJobVo) {
        ScheduleJob scheduleJob = scheduleJobVo.getTargetObject(ScheduleJob.class);
        ScheduleUtils.createScheduleJob(scheduler, scheduleJob);
        return jdbcDao.insert(scheduleJob);
    }

    public void update(ScheduleJobVo scheduleJobVo) {
        ScheduleJob scheduleJob = scheduleJobVo.getTargetObject(ScheduleJob.class);
        ScheduleUtils.updateScheduleJob(scheduler, scheduleJob);
        jdbcDao.update(scheduleJob);
    }

    public void delUpdate(ScheduleJobVo scheduleJobVo) {
        ScheduleJob scheduleJob = scheduleJobVo.getTargetObject(ScheduleJob.class);
        //先删除
        ScheduleUtils.deleteScheduleJob(scheduler, scheduleJob.getJobName(), scheduleJob.getJobGroup());
        //再创建
        ScheduleUtils.createScheduleJob(scheduler, scheduleJob);
        //数据库直接更新即可
        jdbcDao.update(scheduleJob);
    }

    public void delete(Long scheduleJobId) {
        ScheduleJob scheduleJob = jdbcDao.get(ScheduleJob.class, scheduleJobId);
        //删除运行的任务
        ScheduleUtils.deleteScheduleJob(scheduler, scheduleJob.getJobName(), scheduleJob.getJobGroup());
        //删除数据
        jdbcDao.delete(ScheduleJob.class, scheduleJobId);
    }

    public void runOnce(Long scheduleJobId) {

        ScheduleJob scheduleJob = jdbcDao.get(ScheduleJob.class, scheduleJobId);
        ScheduleUtils.runOnce(scheduler, scheduleJob.getJobName(), scheduleJob.getJobGroup());
    }

    public void pauseJob(Long scheduleJobId) {

        ScheduleJob scheduleJob = jdbcDao.get(ScheduleJob.class, scheduleJobId);
        ScheduleUtils.pauseJob(scheduler, scheduleJob.getJobName(), scheduleJob.getJobGroup());

        //演示数据库就不更新了
    }

    public void resumeJob(Long scheduleJobId) {
        ScheduleJob scheduleJob = jdbcDao.get(ScheduleJob.class, scheduleJobId);
        ScheduleUtils.resumeJob(scheduler, scheduleJob.getJobName(), scheduleJob.getJobGroup());

        //演示数据库就不更新了
    }

    public ScheduleJobVo get(Long scheduleJobId) {
        ScheduleJob scheduleJob = jdbcDao.get(ScheduleJob.class, scheduleJobId);
        return scheduleJob.getTargetObject(ScheduleJobVo.class);
    }

    public List<ScheduleJobVo> queryList(ScheduleJobVo scheduleJobVo) {

        List<ScheduleJob> scheduleJobs = jdbcDao.queryList(scheduleJobVo.getTargetObject(ScheduleJob.class));

        List<ScheduleJobVo> scheduleJobVoList = BeanConverter.convert(ScheduleJobVo.class, scheduleJobs);
        try {
            for (ScheduleJobVo vo : scheduleJobVoList) {

                JobKey jobKey = ScheduleUtils.getJobKey(vo.getJobName(), vo.getJobGroup());
                List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
                if (CollectionUtils.isEmpty(triggers)) {
                    continue;
                }

                //这里一个任务可以有多个触发器, 但是我们一个任务对应一个触发器,所以只取第一个即可,清晰明了
                Trigger trigger = triggers.iterator().next();
                scheduleJobVo.setJobTrigger(trigger.getKey().getName());

                Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
                vo.setStatus(triggerState.name());

                if (trigger instanceof CronTrigger) {
                    CronTrigger cronTrigger = (CronTrigger) trigger;
                    String cronExpression = cronTrigger.getCronExpression();
                    vo.setCronExpression(cronExpression);
                }
            }
        } catch (SchedulerException e) {
            //演示用,就不处理了
        }
        return scheduleJobVoList;
    }

    public List<ScheduleJobVo> queryExecutingJobList() {
        try {
            List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs();
            List<ScheduleJobVo> jobList = new ArrayList<ScheduleJobVo>(executingJobs.size());
            for (JobExecutionContext executingJob : executingJobs) {
                ScheduleJobVo job = new ScheduleJobVo();
                JobDetail jobDetail = executingJob.getJobDetail();
                JobKey jobKey = jobDetail.getKey();
                Trigger trigger = executingJob.getTrigger();
                job.setJobName(jobKey.getName());
                job.setJobGroup(jobKey.getGroup());
                job.setJobTrigger(trigger.getKey().getName());
                Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
                job.setStatus(triggerState.name());
                if (trigger instanceof CronTrigger) {
                    CronTrigger cronTrigger = (CronTrigger) trigger;
                    String cronExpression = cronTrigger.getCronExpression();
                    job.setCronExpression(cronExpression);
                }
                jobList.add(job);
            }
            return jobList;
        } catch (SchedulerException e) {
            //演示用,就不处理了
            return null;
        }

    }
}


================================================
FILE: src/main/java/com/dexcoder/demo/utils/FutureLinsener.java
================================================
package com.dexcoder.demo.utils;

import com.google.common.util.concurrent.*;

import java.util.concurrent.Callable;
import java.util.concurrent.Executors;

/**
 * FutureLinsener
 * @author fgt
 * @version 2016/12/18 19:33
 */
public class FutureLinsener {

    final static ListeningExecutorService service =
            MoreExecutors.listeningDecorator(Executors.newCachedThreadPool());

    public static void main(String[] args) {

        //任务1
        ListenableFuture<Boolean> booleanTask = service.submit(new Callable<Boolean>() {
            public Boolean call() throws Exception {
                return true;
            }
        });

        Futures.addCallback(booleanTask, new FutureCallback<Boolean>() {
            public void onSuccess(Boolean result) {
                System.out.println("Boolean Task:" + result);
            }

            public void onFailure(Throwable throwable) {

            }
        });
    }
}


================================================
FILE: src/main/java/com/dexcoder/demo/utils/ScheduleUtils.java
================================================
package com.dexcoder.demo.utils;

import org.quartz.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.dexcoder.demo.exceptions.ScheduleException;
import com.dexcoder.demo.model.ScheduleJob;
import com.dexcoder.demo.quartz.JobFactory;
import com.dexcoder.demo.quartz.JobSyncFactory;
import com.dexcoder.demo.vo.ScheduleJobVo;

/**
 * 定时任务辅助类
 * 
 * Created by liyd on 12/19/14.
 */
public class ScheduleUtils {

    /** 日志对象 */
    private static final Logger LOG = LoggerFactory.getLogger(ScheduleUtils.class);

    /**
     * 获取触发器key
     * 
     * @param jobName
     * @param jobGroup
     * @return
     */
    public static TriggerKey getTriggerKey(String jobName, String jobGroup) {

        return TriggerKey.triggerKey(jobName, jobGroup);
    }

    /**
     * 获取表达式触发器
     *
     * @param scheduler the scheduler
     * @param jobName the job name
     * @param jobGroup the job group
     * @return cron trigger
     */
    public static CronTrigger getCronTrigger(Scheduler scheduler, String jobName, String jobGroup) {

        try {
            TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
            return (CronTrigger) scheduler.getTrigger(triggerKey);
        } catch (SchedulerException e) {
            LOG.error("获取定时任务CronTrigger出现异常", e);
            throw new ScheduleException("获取定时任务CronTrigger出现异常");
        }
    }

    /**
     * 创建任务
     *
     * @param scheduler the scheduler
     * @param scheduleJob the schedule job
     */
    public static void createScheduleJob(Scheduler scheduler, ScheduleJob scheduleJob) {
        createScheduleJob(scheduler, scheduleJob.getJobName(), scheduleJob.getJobGroup(),
            scheduleJob.getCronExpression(), scheduleJob.getIsSync(), scheduleJob);
    }

    /**
     * 创建定时任务
     *
     * @param scheduler the scheduler
     * @param jobName the job name
     * @param jobGroup the job group
     * @param cronExpression the cron expression
     * @param isSync the is sync
     * @param param the param
     */
    public static void createScheduleJob(Scheduler scheduler, String jobName, String jobGroup,
                                         String cronExpression, boolean isSync, Object param) {
        //同步或异步
        Class<? extends Job> jobClass = isSync ? JobSyncFactory.class : JobFactory.class;

        //构建job信息
        JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroup).build();

        //放入参数,运行时的方法可以获取
        jobDetail.getJobDataMap().put(ScheduleJobVo.JOB_PARAM_KEY, param);

        //表达式调度构建器
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);

        //按新的cronExpression表达式构建一个新的trigger
        CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, jobGroup)
            .withSchedule(scheduleBuilder).build();

        try {
            scheduler.scheduleJob(jobDetail, trigger);
        } catch (SchedulerException e) {
            LOG.error("创建定时任务失败", e);
            throw new ScheduleException("创建定时任务失败");
        }
    }

    /**
     * 运行一次任务
     * 
     * @param scheduler
     * @param jobName
     * @param jobGroup
     */
    public static void runOnce(Scheduler scheduler, String jobName, String jobGroup) {
        JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
        try {
            scheduler.triggerJob(jobKey);
        } catch (SchedulerException e) {
            LOG.error("运行一次定时任务失败", e);
            throw new ScheduleException("运行一次定时任务失败");
        }
    }

    /**
     * 暂停任务
     * 
     * @param scheduler
     * @param jobName
     * @param jobGroup
     */
    public static void pauseJob(Scheduler scheduler, String jobName, String jobGroup) {

        JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
        try {
            scheduler.pauseJob(jobKey);
        } catch (SchedulerException e) {
            LOG.error("暂停定时任务失败", e);
            throw new ScheduleException("暂停定时任务失败");
        }
    }

    /**
     * 恢复任务
     *
     * @param scheduler
     * @param jobName
     * @param jobGroup
     */
    public static void resumeJob(Scheduler scheduler, String jobName, String jobGroup) {

        JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
        try {
            scheduler.resumeJob(jobKey);
        } catch (SchedulerException e) {
            LOG.error("暂停定时任务失败", e);
            throw new ScheduleException("暂停定时任务失败");
        }
    }

    /**
     * 获取jobKey
     *
     * @param jobName the job name
     * @param jobGroup the job group
     * @return the job key
     */
    public static JobKey getJobKey(String jobName, String jobGroup) {

        return JobKey.jobKey(jobName, jobGroup);
    }

    /**
     * 更新定时任务
     *
     * @param scheduler the scheduler
     * @param scheduleJob the schedule job
     */
    public static void updateScheduleJob(Scheduler scheduler, ScheduleJob scheduleJob) {
        updateScheduleJob(scheduler, scheduleJob.getJobName(), scheduleJob.getJobGroup(),
            scheduleJob.getCronExpression(), scheduleJob.getIsSync(), scheduleJob);
    }

    /**
     * 更新定时任务
     *
     * @param scheduler the scheduler
     * @param jobName the job name
     * @param jobGroup the job group
     * @param cronExpression the cron expression
     * @param isSync the is sync
     * @param param the param
     */
    public static void updateScheduleJob(Scheduler scheduler, String jobName, String jobGroup,
                                         String cronExpression, boolean isSync, Object param) {

        //同步或异步
//        Class<? extends Job> jobClass = isSync ? JobSyncFactory.class : JobFactory.class;

        try {
//            JobDetail jobDetail = scheduler.getJobDetail(getJobKey(jobName, jobGroup));

//            jobDetail = jobDetail.getJobBuilder().ofType(jobClass).build();

            //更新参数 实际测试中发现无法更新
//            JobDataMap jobDataMap = jobDetail.getJobDataMap();
//            jobDataMap.put(ScheduleJobVo.JOB_PARAM_KEY, param);
//            jobDetail.getJobBuilder().usingJobData(jobDataMap);

            TriggerKey triggerKey = ScheduleUtils.getTriggerKey(jobName, jobGroup);

            //表达式调度构建器
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);

            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);

            //按新的cronExpression表达式重新构建trigger
            trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder)
                .build();

            //按新的trigger重新设置job执行
            scheduler.rescheduleJob(triggerKey, trigger);
        } catch (SchedulerException e) {
            LOG.error("更新定时任务失败", e);
            throw new ScheduleException("更新定时任务失败");
        }
    }

    /**
     * 删除定时任务
     *
     * @param scheduler
     * @param jobName
     * @param jobGroup
     */
    public static void deleteScheduleJob(Scheduler scheduler, String jobName, String jobGroup) {
        try {
            scheduler.deleteJob(getJobKey(jobName, jobGroup));
        } catch (SchedulerException e) {
            LOG.error("删除定时任务失败", e);
            throw new ScheduleException("删除定时任务失败");
        }
    }
}


================================================
FILE: src/main/java/com/dexcoder/demo/vo/ScheduleJobVo.java
================================================
package com.dexcoder.demo.vo;

import com.dexcoder.commons.pager.Pageable;

import java.util.Date;

/**
 * Created by liyd on 12/19/14.
 */
public class ScheduleJobVo extends Pageable {

    private static final long  serialVersionUID = -4216107640768329946L;

    /** 任务调度的参数key */
    public static final String JOB_PARAM_KEY    = "jobParam";

    /** 任务id */
    private Long               scheduleJobId;

    /** 任务名称 */
    private String             jobName;

    /** 任务别名 */
    private String             aliasName;

    /** 任务分组 */
    private String             jobGroup;

    /** 触发器 */
    private String             jobTrigger;

    /** 任务状态 */
    private String             status;

    /** 任务运行时间表达式 */
    private String             cronExpression;

    /** 是否异步 */
    private Boolean            isSync;

    /** 任务描述 */
    private String             description;

    /** 创建时间 */
    private Date               gmtCreate;

    /** 修改时间 */
    private Date               gmtModify;

    public Long getScheduleJobId() {
        return scheduleJobId;
    }

    public void setScheduleJobId(Long scheduleJobId) {
        this.scheduleJobId = scheduleJobId;
    }

    public String getJobName() {
        return jobName;
    }

    public void setJobName(String jobName) {
        this.jobName = jobName;
    }

    public String getAliasName() {
        return aliasName;
    }

    public void setAliasName(String aliasName) {
        this.aliasName = aliasName;
    }

    public String getJobGroup() {
        return jobGroup;
    }

    public void setJobGroup(String jobGroup) {
        this.jobGroup = jobGroup;
    }

    public String getJobTrigger() {
        return jobTrigger;
    }

    public void setJobTrigger(String jobTrigger) {
        this.jobTrigger = jobTrigger;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getCronExpression() {
        return cronExpression;
    }

    public void setCronExpression(String cronExpression) {
        this.cronExpression = cronExpression;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Date getGmtCreate() {
        return gmtCreate;
    }

    public void setGmtCreate(Date gmtCreate) {
        this.gmtCreate = gmtCreate;
    }

    public Date getGmtModify() {
        return gmtModify;
    }

    public void setGmtModify(Date gmtModify) {
        this.gmtModify = gmtModify;
    }

    public Boolean getIsSync() {
        return isSync;
    }

    public void setIsSync(Boolean isSync) {
        this.isSync = isSync;
    }
}


================================================
FILE: src/main/resources/applicationContext.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd

	http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan base-package="com.dexcoder.demo.*">
    </context:component-scan>

    <!-- 启用@Aspect支持 -->
    <aop:aspectj-autoproxy/>

    <context:property-placeholder location="classpath:init.properties"/>


    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
          destroy-method="close">
        <property name="driverClassName">
            <value>${driverClassName}</value>
        </property>
        <property name="url">
            <value>${jdbcUrl}</value>
        </property>
        <property name="username">
            <value>${username}</value>
        </property>
        <property name="password">
            <value>${password}</value>
        </property>
        <property name="initialSize">
            <value>${initialSize}</value>
        </property>
        <property name="maxActive">
            <value>${maxActive}</value>
        </property>
        <property name="maxIdle">
            <value>${maxIdle}</value>
        </property>
        <property name="maxWait">
            <value>${maxWait}</value>
        </property>
    </bean>

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource">
            <ref bean="dataSource"/>
        </property>
        <property name="fetchSize">
            <value>${jdbcTemplate.fetchSize}</value>
        </property>
    </bean>

    <bean id="jdbcDao" class="com.dexcoder.dal.spring.JdbcDaoImpl">
        <property name="jdbcTemplate" ref="jdbcTemplate"/>
    </bean>

    <bean id="jobFactory" class="com.dexcoder.demo.quartz.JobFactoryConfiguration" />
    <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
        <property name="jobFactory" ref="jobFactory" />
    </bean>
</beans>

================================================
FILE: src/main/resources/init.properties
================================================
#test
driverClassName=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
username=root
password=root
jdbcTemplate.fetchSize=350
initialSize = 3
maxActive = 100
maxIdle = 5
maxWait = 10


================================================
FILE: src/main/resources/log4j.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <!-- Console Appender -->
    <appender name="STDOUT-APPENDER" class="org.apache.log4j.ConsoleAppender">
        <param name="encoding" value="UTF-8"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%r][%p][%t] %d{HH:mm:ss,SSS} method:%l %m%n"/>
        </layout>
    </appender>

    <!-- html Appender -->
    <!--<appender name="HTML-APPENDER" class="org.apache.log4j.RollingFileAppender">-->
        <!--<param name="file" value="${tbss.root}/logs/app_log.html"/>-->
        <!--<param name="append" value="false"/>-->
        <!--<param name="encoding" value="UTF-8"/>-->
        <!--<param name="maxFileSize" value="1048576"/>-->
        <!--<param name="maxBackupIndex" value="3"/>-->
        <!--<layout class="org.apache.log4j.HTMLLayout">-->
            <!--<param name="locationInfo" value="true" />-->
            <!--<param name="title" value="项目日志" />-->
        <!--</layout>-->
    <!--</appender>-->

    <!-- Default Appender -->
    <appender name="DEFAULT-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="${catalina.home}/logs/dexcoder/common-default.log"/>
        <param name="append" value="true"/>
        <param name="encoding" value="UTF-8"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%r][%p][%t] %d{HH:mm:ss,SSS} method:%l %m%n"/>
        </layout>
    </appender>

    <!-- Debug Appender -->
    <appender name="DEBUG-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="${catalina.home}/logs/dexcoder/common-dexcoder-debug.log"/>
        <param name="append" value="true"/>
        <param name="encoding" value="UTF-8"/>

        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%r][%p][%t] %d{HH:mm:ss,SSS} method:%l %m%n"/>
        </layout>
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="LevelMin" value="debug"/>
            <param name="LevelMax" value="debug"/>
            <param name="AcceptOnMatch" value="true"/>
        </filter>
    </appender>

    <!-- info Appender -->
    <appender name="INFO-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="${catalina.home}/logs/dexcoder/common-dexcoder-info.log"/>
        <param name="append" value="true"/>
        <param name="encoding" value="UTF-8"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%r][%p][%t] %d{HH:mm:ss,SSS} method:%l %m%n"/>
        </layout>
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="LevelMin" value="info"/>
            <param name="LevelMax" value="info"/>
            <param name="AcceptOnMatch" value="true"/>
        </filter>
    </appender>

    <!-- warn Appender -->
    <appender name="WARN-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="${catalina.home}/logs/dexcoder/common-dexcoder-warn.log"/>
        <param name="append" value="true"/>
        <param name="encoding" value="UTF-8"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%r][%p][%t] %d{HH:mm:ss,SSS} method:%l %m%n"/>
        </layout>
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="LevelMin" value="warn"/>
            <param name="LevelMax" value="warn"/>
            <param name="AcceptOnMatch" value="true"/>
        </filter>
    </appender>

    <!-- error Appender -->
    <appender name="ERROR-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="${catalina.home}/logs/dexcoder/common-dexcoder-error.log"/>
        <param name="append" value="true"/>
        <param name="encoding" value="UTF-8"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%r][%p][%t] %d{HH:mm:ss,SSS} method:%l %m%n"/>
        </layout>
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="LevelMin" value="error"/>
            <param name="LevelMax" value="error"/>
            <param name="AcceptOnMatch" value="true"/>
        </filter>
    </appender>

    <!-- spring Appender -->
    <appender name="SPRING-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="${catalina.home}/logs/dexcoder/common-spring.log"/>
        <param name="append" value="true"/>
        <param name="encoding" value="UTF-8"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%r][%p][%t] %d{HH:mm:ss,SSS} method:%l %m%n"/>
        </layout>
    </appender>

    <!-- struts Appender -->
    <!--<appender name="STRUTS-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">-->
        <!--<param name="file" value="${catalina.home}/logs/dexcoder/common-struts.log"/>-->
        <!--<param name="append" value="true"/>-->
        <!--<param name="encoding" value="UTF-8"/>-->
        <!--<layout class="org.apache.log4j.PatternLayout">-->
            <!--<param name="ConversionPattern" value="[%r][%p][%t] %d{HH:mm:ss,SSS} method:%l %m%n"/>-->
        <!--</layout>-->
    <!--</appender>-->

    <!-- mybatis Appender -->
    <!--<appender name="MYBATIS-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">-->
        <!--<param name="file" value="${catalina.home}/logs/dexcoder/common-mybatis.log"/>-->
        <!--<param name="append" value="true"/>-->
        <!--<param name="encoding" value="UTF-8"/>-->
        <!--<layout class="org.apache.log4j.PatternLayout">-->
            <!--<param name="ConversionPattern" value="[%r][%p][%t] %d{HH:mm:ss,SSS} method:%l %m%n"/>-->
        <!--</layout>-->
    <!--</appender>-->

    <!-- cxf Appender -->
    <!--<appender name="CXF-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">-->
        <!--<param name="file" value="${catalina.home}/logs/dexcoder/common-cxf.log"/>-->
        <!--<param name="append" value="true"/>-->
        <!--<param name="encoding" value="UTF-8"/>-->
        <!--<layout class="org.apache.log4j.PatternLayout">-->
            <!--<param name="ConversionPattern" value="[%r][%p][%t] %d{HH:mm:ss,SSS} method:%l %m%n"/>-->
        <!--</layout>-->
    <!--</appender>-->

    <!--xmemcached Appender-->
    <!--<appender name="XMEMCACHED-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">-->
        <!--<param name="file" value="${catalina.home}/logs/dexcoder/common-xmemcached.log"/>-->
        <!--<param name="append" value="true"/>-->
        <!--<param name="encoding" value="UTF-8"/>-->
        <!--<layout class="org.apache.log4j.PatternLayout">-->
            <!--<param name="ConversionPattern" value="[%r][%p][%t] %d{HH:mm:ss,SSS} method:%l %m%n"/>-->
        <!--</layout>-->
    <!--</appender>-->

    <!--velocity Appender-->
    <appender name="VELOCITY-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="${catalina.home}/logs/dexcoder/common-velocity.log"/>
        <param name="append" value="true"/>
        <param name="encoding" value="UTF-8"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%r][%p][%t] %d{HH:mm:ss,SSS} method:%l %m%n"/>
        </layout>
    </appender>

    <!-- dexcoder logger -->
    <logger name="com.dexcoder" additivity="true">
        <appender-ref ref="DEBUG-APPENDER"/>
        <appender-ref ref="INFO-APPENDER"/>
        <appender-ref ref="WARN-APPENDER"/>
        <appender-ref ref="ERROR-APPENDER"/>
    </logger>

    <!--spring logger-->
    <logger name="org.springframework" additivity="true">
        <appender-ref ref="SPRING-APPENDER"/>
    </logger>

    <!--struts logger-->
    <!--<logger name="com.opensymphony" additivity="true">-->
        <!--<appender-ref ref="STRUTS-APPENDER"/>-->
    <!--</logger>-->
    <!--<logger name="org.apache.struts2" additivity="true">-->
        <!--<appender-ref ref="STRUTS-APPENDER"/>-->
    <!--</logger>-->

    <!--mybatis logger-->
    <!--<logger name="java.sql" additivity="true">-->
        <!--<level value="info"></level>-->
        <!--<appender-ref ref="MYBATIS-APPENDER"/>-->
    <!--</logger>-->

    <!--cxf logger-->
    <!--<logger name="org.apache.cxf" additivity="true">-->
        <!--<appender-ref ref="CXF-APPENDER"/>-->
    <!--</logger>-->

    <!--xmemcached logger-->
    <!--<logger name="net.rubyeye.xmemcached" additivity="true">-->
        <!--<appender-ref ref="XMEMCACHED-APPENDER"/>-->
    <!--</logger>-->
    <!--<logger name="com.google.code" additivity="true">-->
        <!--<appender-ref ref="XMEMCACHED-APPENDER"/>-->
    <!--</logger>-->

    <!--velocity logger-->
    <logger name="org.apache.velocity" additivity="true">
        <appender-ref ref="VELOCITY-APPENDER"/>
    </logger>
    <logger name="velocity_log" additivity="true">
        <appender-ref ref="VELOCITY-APPENDER"/>
    </logger>

    <!-- root logger -->
    <root>
        <level value="info"/>
        <appender-ref ref="DEFAULT-APPENDER"/>
        <appender-ref ref="STDOUT-APPENDER"/>
        <!--<appender-ref ref="HTML-APPENDER"/>-->
    </root>

</log4j:configuration>

================================================
FILE: src/main/resources/spring-mvc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan
            base-package="com.dexcoder.demo.*"/>

    <!-- 视图解析器,根据视图的名称new ModelAndView(name),在配置文件查找对应的bean配置 -->

    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="order" value="1"/>
        <property name="ignoreAcceptHeader" value="true"/>
        <property name="mediaTypes">
            <map>
                <entry key="json" value="application/json;charset=UTF-8"/>
                <entry key="xml" value="application/xml;charset=UTF-8"/>
                <entry key="rss" value="application/rss+xml;charset=UTF-8"/>
            </map>
        </property>

        <property name="defaultViews">
            <list>
            </list>
        </property>
    </bean>

    <bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
        <property name="resourceLoaderPath" value="/WEB-INF"/>
        <property name="configLocation" value="classpath:velocity.properties"/>
    </bean>

    <bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
        <property name="order" value="2"/>
        <property name="suffix" value=".vm"/>
        <property name="prefix" value="/"/>
        <property name="exposeSpringMacroHelpers" value="true"/>
        <property name="requestContextAttribute" value="rc"/>
        <property name="contentType" value="text/html;charset=UTF-8"/>
        <!--<property name="toolboxConfigLocation" value="/WEB-INF/toolbox.xml"/>-->
    </bean>
</beans>

================================================
FILE: src/main/resources/spring-quartz.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean id="jobFactory" class="com.dexcoder.demo.quartz.JobFactoryConfiguration" />
    <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="jobFactory" ref="jobFactory" />
    </bean>
</beans>

================================================
FILE: src/main/resources/velocity.properties
================================================

#tools.view.servlet.layout.directory = /WEB-INF/templates/layout/
tools.view.servlet.layout.default.template = default.vm
default.contentType=text/html;charset=utf-8
input.encoding = UTF-8
output.encoding = UTF-8
class.resource.loader.cache=false
velocimacro.library.autoreload=true
directive.set.null.allowed = true
runtime.log.error.stacktrace = true
runtime.log.warn.stacktrace = true
runtime.log.info.stacktrace = true
runtime.log.logsystem.class = org.apache.velocity.runtime.log.SimpleLog4JLogSystem
runtime.log.logsystem.log4j.category = velocity_log

================================================
FILE: src/main/webapp/WEB-INF/input-schedule-job.vm
================================================
<!DOCTYPE html>
<html>
<head>
    <title>添加/修改任务</title>
    <meta charset="UTF-8">
</head>
<body>
<form action="save-schedule-job.shtml" method="post">
    <input type="hidden" name="scheduleJobId" value="$!{scheduleJobVo.scheduleJobId}">
    <input type="hidden" name="keywords" value="$!{scheduleJobVo.keywords}">
<table>
    <tr>
        <td>任务名称<span style="color: red">* </span></td>
        <td><input  type="text" name="jobName" value="$!{scheduleJobVo.jobName}"></td>
    </tr>
    <tr>
        <td>任务分组<span style="color: red">* </span></td>
        <td><input  type="text" name="jobGroup" value="$!{scheduleJobVo.jobGroup}"></td>
    </tr>
    <tr>
        <td>任务别名</td>
        <td><input type="text" name="aliasName" value="$!{scheduleJobVo.aliasName}"></td>
    </tr>
    <tr>
        <td>时间表达式<span style="color: red">* </span></td>
        <td><input type="text" name="cronExpression" title="如0/10 * * * * ? 每10秒执行一次" value="$!{scheduleJobVo.cronExpression}"></td>
    </tr>
    <tr>
        <td>是否异步<span style="color: red">* </span></td>
        <td><input type="text" name="isSync" title="输入true或者false" value="$!{scheduleJobVo.isSync}"></td>
    </tr>
    <tr>
        <td>任务描述</td>
        <td><input type="text" name="description" value="$!{scheduleJobVo.description}"></td>
    </tr>
</table>
    <button type="submit">确认</button>
</form>
</body>
</html>

================================================
FILE: src/main/webapp/WEB-INF/list-schedule-job.vm
================================================
<!DOCTYPE html>
<html>
<head>
    <title>任务列表</title>
    <meta charset="UTF-8">
</head>
<body>
<a href="input-schedule-job.shtml">添加任务</a>
<table border="1">
    <tr>
        <td>任务名称</td>
        <td>任务别名</td>
        <td>任务分组</td>
        <td>触发器</td>
        <td>任务状态</td>
        <td>时间表达式</td>
        <td>是否异步</td>
        <td>任务描述</td>
        <td>操作</td>
    </tr>
    #foreach($item in $scheduleJobVoList)
        <tr>
            <td>$!{item.jobName}</td>
            <td>$!{item.aliasName}</td>
            <td>$!{item.jobGroup}</td>
            <td>$!{item.jobTrigger}</td>
            <td>$!{item.status}</td>
            <td>$!{item.cronExpression}</td>
            <td>$!{item.isSync}</td>
            <td>$!{item.description}</td>
            <td>
                <a href="input-schedule-job.shtml?scheduleJobId=$!{item.scheduleJobId}">直接修改方式</a>
                <a href="input-schedule-job.shtml?scheduleJobId=$!{item.scheduleJobId}&keywords=delUpdate">删除创建方式</a>
                <a href="delete-schedule-job.shtml?scheduleJobId=$!{item.scheduleJobId}">删除</a>
                <a href="pause-schedule-job.shtml?scheduleJobId=$!{item.scheduleJobId}">暂停</a>
                <a href="resume-schedule-job.shtml?scheduleJobId=$!{item.scheduleJobId}">恢复</a>
                <a href="run-once-schedule-job.shtml?scheduleJobId=$!{item.scheduleJobId}">立即运行一次</a>
            </td>
        </tr>
    #end
</table>
<br>
运行中的任务
<table border="1">
    <tr>
        <td>任务名称</td>
        <td>任务别名</td>
        <td>任务分组</td>
        <td>触发器</td>
        <td>任务状态</td>
        <td>时间表达式</td>
        <td>是否异步</td>
        <td>任务描述</td>
    </tr>
    #foreach($item in $executingJobList)
        <tr>
            <td>$!{item.jobName}</td>
            <td>$!{item.aliasName}</td>
            <td>$!{item.jobGroup}</td>
            <td>$!{item.jobTrigger}</td>
            <td>$!{item.status}</td>
            <td>$!{item.cronExpression}</td>
            <td>$!{item.isSync}</td>
            <td>$!{item.desc}</td>
        </tr>
    #end
</table>
</body>
</html>

================================================
FILE: src/main/webapp/WEB-INF/web.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         id="WebApp_ID" version="2.5">

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml,classpath:spring-quartz.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>


================================================
FILE: src/main/webapp/index.jsp
================================================
<!DOCTYPE html>
<%@ page contentType="text/html; charset=gbk"%>
<html>
<head>
    <title>Dexcoder - ݵijԱ </title>
    <meta charset="UTF-8">
</head>
<body>
    <a href="list-schedule-job">б</a>
</body>
</html>
Download .txt
gitextract_9rz2okf2/

├── README.md
├── doc/
│   └── init.sql
├── pom.xml
└── src/
    └── main/
        ├── java/
        │   └── com/
        │       └── dexcoder/
        │           └── demo/
        │               ├── controller/
        │               │   └── ScheduleJobController.java
        │               ├── event/
        │               │   └── ScheduleJobInit.java
        │               ├── exceptions/
        │               │   └── ScheduleException.java
        │               ├── model/
        │               │   └── ScheduleJob.java
        │               ├── quartz/
        │               │   ├── JobFactory.java
        │               │   ├── JobFactoryConfiguration.java
        │               │   └── JobSyncFactory.java
        │               ├── service/
        │               │   ├── ScheduleJobService.java
        │               │   └── impl/
        │               │       └── ScheduleJobServiceImpl.java
        │               ├── utils/
        │               │   ├── FutureLinsener.java
        │               │   └── ScheduleUtils.java
        │               └── vo/
        │                   └── ScheduleJobVo.java
        ├── resources/
        │   ├── applicationContext.xml
        │   ├── init.properties
        │   ├── log4j.xml
        │   ├── spring-mvc.xml
        │   ├── spring-quartz.xml
        │   └── velocity.properties
        └── webapp/
            ├── WEB-INF/
            │   ├── input-schedule-job.vm
            │   ├── list-schedule-job.vm
            │   └── web.xml
            └── index.jsp
Download .txt
SYMBOL INDEX (105 symbols across 13 files)

FILE: doc/init.sql
  type schedule_job (line 2) | CREATE TABLE schedule_job(

FILE: src/main/java/com/dexcoder/demo/controller/ScheduleJobController.java
  class ScheduleJobController (line 18) | @Controller
    method inputScheduleJob (line 30) | @RequestMapping(value = "input-schedule-job", method = RequestMethod.GET)
    method deleteScheduleJob (line 47) | @RequestMapping(value = "delete-schedule-job", method = RequestMethod....
    method runOnceScheduleJob (line 60) | @RequestMapping(value = "run-once-schedule-job", method = RequestMetho...
    method pauseScheduleJob (line 73) | @RequestMapping(value = "pause-schedule-job", method = RequestMethod.GET)
    method resumeScheduleJob (line 84) | @RequestMapping(value = "resume-schedule-job", method = RequestMethod....
    method saveScheduleJob (line 96) | @RequestMapping(value = "save-schedule-job", method = RequestMethod.POST)
    method listScheduleJob (line 119) | @RequestMapping(value = "list-schedule-job", method = RequestMethod.GET)

FILE: src/main/java/com/dexcoder/demo/event/ScheduleJobInit.java
  class ScheduleJobInit (line 17) | @Component
    method init (line 30) | @PostConstruct

FILE: src/main/java/com/dexcoder/demo/exceptions/ScheduleException.java
  class ScheduleException (line 10) | public class ScheduleException extends DexcoderException {
    method ScheduleException (line 20) | public ScheduleException(Throwable e) {
    method ScheduleException (line 29) | public ScheduleException(String message) {
    method ScheduleException (line 39) | public ScheduleException(String code, String message) {

FILE: src/main/java/com/dexcoder/demo/model/ScheduleJob.java
  class ScheduleJob (line 14) | public class ScheduleJob extends Pageable {
    method getScheduleJobId (line 51) | public Long getScheduleJobId() {
    method setScheduleJobId (line 55) | public void setScheduleJobId(Long scheduleJobId) {
    method getJobName (line 59) | public String getJobName() {
    method setJobName (line 63) | public void setJobName(String jobName) {
    method getAliasName (line 67) | public String getAliasName() {
    method setAliasName (line 71) | public void setAliasName(String aliasName) {
    method getJobGroup (line 75) | public String getJobGroup() {
    method setJobGroup (line 79) | public void setJobGroup(String jobGroup) {
    method getJobTrigger (line 83) | public String getJobTrigger() {
    method setJobTrigger (line 87) | public void setJobTrigger(String jobTrigger) {
    method getStatus (line 91) | public String getStatus() {
    method setStatus (line 95) | public void setStatus(String status) {
    method getCronExpression (line 99) | public String getCronExpression() {
    method setCronExpression (line 103) | public void setCronExpression(String cronExpression) {
    method getIsSync (line 107) | public Boolean getIsSync() {
    method setIsSync (line 111) | public void setIsSync(Boolean isSync) {
    method getDescription (line 115) | public String getDescription() {
    method setDescription (line 119) | public void setDescription(String description) {
    method getGmtCreate (line 123) | public Date getGmtCreate() {
    method setGmtCreate (line 127) | public void setGmtCreate(Date gmtCreate) {
    method getGmtModify (line 131) | public Date getGmtModify() {
    method setGmtModify (line 135) | public void setGmtModify(Date gmtModify) {

FILE: src/main/java/com/dexcoder/demo/quartz/JobFactory.java
  class JobFactory (line 20) | @DisallowConcurrentExecution
    method execute (line 26) | public void execute(JobExecutionContext context) throws JobExecutionEx...

FILE: src/main/java/com/dexcoder/demo/quartz/JobFactoryConfiguration.java
  class JobFactoryConfiguration (line 14) | public class JobFactoryConfiguration extends AdaptableJobFactory {
    method createJobInstance (line 19) | @Override

FILE: src/main/java/com/dexcoder/demo/quartz/JobSyncFactory.java
  class JobSyncFactory (line 18) | @Component
    method execute (line 27) | public void execute(JobExecutionContext jobExecutionContext) throws Jo...

FILE: src/main/java/com/dexcoder/demo/service/ScheduleJobService.java
  type ScheduleJobService (line 13) | public interface ScheduleJobService {
    method initScheduleJob (line 18) | public void initScheduleJob();
    method insert (line 26) | public Long insert(ScheduleJobVo scheduleJobVo);
    method update (line 33) | public void update(ScheduleJobVo scheduleJobVo);
    method delUpdate (line 40) | public void delUpdate(ScheduleJobVo scheduleJobVo);
    method delete (line 47) | public void delete(Long scheduleJobId);
    method runOnce (line 55) | public void runOnce(Long scheduleJobId);
    method pauseJob (line 63) | public void pauseJob(Long scheduleJobId);
    method resumeJob (line 71) | public void resumeJob(Long scheduleJobId);
    method get (line 79) | public ScheduleJobVo get(Long scheduleJobId);
    method queryList (line 87) | public List<ScheduleJobVo> queryList(ScheduleJobVo scheduleJobVo);
    method queryExecutingJobList (line 94) | public List<ScheduleJobVo> queryExecutingJobList();

FILE: src/main/java/com/dexcoder/demo/service/impl/ScheduleJobServiceImpl.java
  class ScheduleJobServiceImpl (line 24) | @Service
    method initScheduleJob (line 35) | public void initScheduleJob() {
    method insert (line 55) | public Long insert(ScheduleJobVo scheduleJobVo) {
    method update (line 61) | public void update(ScheduleJobVo scheduleJobVo) {
    method delUpdate (line 67) | public void delUpdate(ScheduleJobVo scheduleJobVo) {
    method delete (line 77) | public void delete(Long scheduleJobId) {
    method runOnce (line 85) | public void runOnce(Long scheduleJobId) {
    method pauseJob (line 91) | public void pauseJob(Long scheduleJobId) {
    method resumeJob (line 99) | public void resumeJob(Long scheduleJobId) {
    method get (line 106) | public ScheduleJobVo get(Long scheduleJobId) {
    method queryList (line 111) | public List<ScheduleJobVo> queryList(ScheduleJobVo scheduleJobVo) {
    method queryExecutingJobList (line 144) | public List<ScheduleJobVo> queryExecutingJobList() {

FILE: src/main/java/com/dexcoder/demo/utils/FutureLinsener.java
  class FutureLinsener (line 13) | public class FutureLinsener {
    method main (line 18) | public static void main(String[] args) {

FILE: src/main/java/com/dexcoder/demo/utils/ScheduleUtils.java
  class ScheduleUtils (line 18) | public class ScheduleUtils {
    method getTriggerKey (line 30) | public static TriggerKey getTriggerKey(String jobName, String jobGroup) {
    method getCronTrigger (line 43) | public static CronTrigger getCronTrigger(Scheduler scheduler, String j...
    method createScheduleJob (line 60) | public static void createScheduleJob(Scheduler scheduler, ScheduleJob ...
    method createScheduleJob (line 75) | public static void createScheduleJob(Scheduler scheduler, String jobNa...
    method runOnce (line 108) | public static void runOnce(Scheduler scheduler, String jobName, String...
    method pauseJob (line 125) | public static void pauseJob(Scheduler scheduler, String jobName, Strin...
    method resumeJob (line 143) | public static void resumeJob(Scheduler scheduler, String jobName, Stri...
    method getJobKey (line 161) | public static JobKey getJobKey(String jobName, String jobGroup) {
    method updateScheduleJob (line 172) | public static void updateScheduleJob(Scheduler scheduler, ScheduleJob ...
    method updateScheduleJob (line 187) | public static void updateScheduleJob(Scheduler scheduler, String jobNa...
    method deleteScheduleJob (line 229) | public static void deleteScheduleJob(Scheduler scheduler, String jobNa...

FILE: src/main/java/com/dexcoder/demo/vo/ScheduleJobVo.java
  class ScheduleJobVo (line 10) | public class ScheduleJobVo extends Pageable {
    method getScheduleJobId (line 50) | public Long getScheduleJobId() {
    method setScheduleJobId (line 54) | public void setScheduleJobId(Long scheduleJobId) {
    method getJobName (line 58) | public String getJobName() {
    method setJobName (line 62) | public void setJobName(String jobName) {
    method getAliasName (line 66) | public String getAliasName() {
    method setAliasName (line 70) | public void setAliasName(String aliasName) {
    method getJobGroup (line 74) | public String getJobGroup() {
    method setJobGroup (line 78) | public void setJobGroup(String jobGroup) {
    method getJobTrigger (line 82) | public String getJobTrigger() {
    method setJobTrigger (line 86) | public void setJobTrigger(String jobTrigger) {
    method getStatus (line 90) | public String getStatus() {
    method setStatus (line 94) | public void setStatus(String status) {
    method getCronExpression (line 98) | public String getCronExpression() {
    method setCronExpression (line 102) | public void setCronExpression(String cronExpression) {
    method getDescription (line 106) | public String getDescription() {
    method setDescription (line 110) | public void setDescription(String description) {
    method getGmtCreate (line 114) | public Date getGmtCreate() {
    method setGmtCreate (line 118) | public void setGmtCreate(Date gmtCreate) {
    method getGmtModify (line 122) | public Date getGmtModify() {
    method setGmtModify (line 126) | public void setGmtModify(Date gmtModify) {
    method getIsSync (line 130) | public Boolean getIsSync() {
    method setIsSync (line 134) | public void setIsSync(Boolean isSync) {
Condensed preview — 25 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (65K chars).
[
  {
    "path": "README.md",
    "chars": 265,
    "preview": "## spring-quartz-demo\n## 功能\nspring整合quartz动态定时任务demo,实现对定时任务的创建、删除、暂停、恢复,以及一个列表展示控制页面。\n## 使用 \n先找到项目根目录/doc/init.sql初始化数据"
  },
  {
    "path": "doc/init.sql",
    "chars": 574,
    "preview": "DROP TABLE IF EXISTS schedule_job;\nCREATE TABLE schedule_job(\nschedule_job_id BIGINT(20) NOT NULL auto_increment,\njob_na"
  },
  {
    "path": "pom.xml",
    "chars": 6298,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "src/main/java/com/dexcoder/demo/controller/ScheduleJobController.java",
    "chars": 3699,
    "preview": "package com.dexcoder.demo.controller;\n\nimport java.util.List;\n\nimport org.apache.commons.lang.StringUtils;\nimport org.sp"
  },
  {
    "path": "src/main/java/com/dexcoder/demo/event/ScheduleJobInit.java",
    "chars": 872,
    "preview": "package com.dexcoder.demo.event;\n\nimport javax.annotation.PostConstruct;\n\nimport org.slf4j.Logger;\nimport org.slf4j.Logg"
  },
  {
    "path": "src/main/java/com/dexcoder/demo/exceptions/ScheduleException.java",
    "chars": 827,
    "preview": "package com.dexcoder.demo.exceptions;\n\nimport com.dexcoder.commons.exceptions.DexcoderException;\n\n/**\n * 自定义异常\n * \n * Cr"
  },
  {
    "path": "src/main/java/com/dexcoder/demo/model/ScheduleJob.java",
    "chars": 2703,
    "preview": "package com.dexcoder.demo.model;\n\nimport java.util.Date;\n\nimport com.dexcoder.commons.pager.Pageable;\n\n/**\n * 计划任务信息\n * "
  },
  {
    "path": "src/main/java/com/dexcoder/demo/quartz/JobFactory.java",
    "chars": 1085,
    "preview": "package com.dexcoder.demo.quartz;\n\nimport org.quartz.DisallowConcurrentExecution;\nimport org.quartz.Job;\nimport org.quar"
  },
  {
    "path": "src/main/java/com/dexcoder/demo/quartz/JobFactoryConfiguration.java",
    "chars": 854,
    "preview": "package com.dexcoder.demo.quartz;\n\nimport org.quartz.spi.TriggerFiredBundle;\nimport org.springframework.beans.factory.an"
  },
  {
    "path": "src/main/java/com/dexcoder/demo/quartz/JobSyncFactory.java",
    "chars": 1199,
    "preview": "package com.dexcoder.demo.quartz;\n\nimport com.dexcoder.demo.service.ScheduleJobService;\nimport org.quartz.*;\nimport org."
  },
  {
    "path": "src/main/java/com/dexcoder/demo/service/ScheduleJobService.java",
    "chars": 1652,
    "preview": "package com.dexcoder.demo.service;\n\nimport java.util.List;\n\nimport com.dexcoder.demo.model.ScheduleJob;\nimport com.dexco"
  },
  {
    "path": "src/main/java/com/dexcoder/demo/service/impl/ScheduleJobServiceImpl.java",
    "chars": 6492,
    "preview": "package com.dexcoder.demo.service.impl;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.apache.commons.c"
  },
  {
    "path": "src/main/java/com/dexcoder/demo/utils/FutureLinsener.java",
    "chars": 942,
    "preview": "package com.dexcoder.demo.utils;\n\nimport com.google.common.util.concurrent.*;\n\nimport java.util.concurrent.Callable;\nimp"
  },
  {
    "path": "src/main/java/com/dexcoder/demo/utils/ScheduleUtils.java",
    "chars": 7213,
    "preview": "package com.dexcoder.demo.utils;\n\nimport org.quartz.*;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport "
  },
  {
    "path": "src/main/java/com/dexcoder/demo/vo/ScheduleJobVo.java",
    "chars": 2771,
    "preview": "package com.dexcoder.demo.vo;\n\nimport com.dexcoder.commons.pager.Pageable;\n\nimport java.util.Date;\n\n/**\n * Created by li"
  },
  {
    "path": "src/main/resources/applicationContext.xml",
    "chars": 2466,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:context=\""
  },
  {
    "path": "src/main/resources/init.properties",
    "chars": 237,
    "preview": "#test\ndriverClassName=com.mysql.jdbc.Driver\njdbcUrl=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=u"
  },
  {
    "path": "src/main/resources/log4j.xml",
    "chars": 9569,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE log4j:configuration SYSTEM \"log4j.dtd\">\n\n<log4j:configuration xmlns:log"
  },
  {
    "path": "src/main/resources/spring-mvc.xml",
    "chars": 2252,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:xsi=\"http"
  },
  {
    "path": "src/main/resources/spring-quartz.xml",
    "chars": 564,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:xsi=\"http"
  },
  {
    "path": "src/main/resources/velocity.properties",
    "chars": 558,
    "preview": "\n#tools.view.servlet.layout.directory = /WEB-INF/templates/layout/\ntools.view.servlet.layout.default.template = default."
  },
  {
    "path": "src/main/webapp/WEB-INF/input-schedule-job.vm",
    "chars": 1377,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n    <title>添加/修改任务</title>\n    <meta charset=\"UTF-8\">\n</head>\n<body>\n<form action=\"save-sc"
  },
  {
    "path": "src/main/webapp/WEB-INF/list-schedule-job.vm",
    "chars": 2060,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n    <title>任务列表</title>\n    <meta charset=\"UTF-8\">\n</head>\n<body>\n<a href=\"input-schedule-"
  },
  {
    "path": "src/main/webapp/WEB-INF/web.xml",
    "chars": 1893,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<web-app xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xmlns=\"ht"
  },
  {
    "path": "src/main/webapp/index.jsp",
    "chars": 208,
    "preview": "<!DOCTYPE html>\n<%@ page contentType=\"text/html; charset=gbk\"%>\n<html>\n<head>\n    <title>Dexcoder - ݵijԱ </title>\n    <me"
  }
]

About this extraction

This page contains the full source code of the gui66497/spring-quartz-demo GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 25 files (57.3 KB), approximately 15.5k tokens, and a symbol index with 105 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!