Quartz定时任务

来源:互联网 发布:什么是数据的有效性 编辑:程序博客网 时间:2024/06/03 07:24

有关于定时任务,是之前公司项目有一个定时任务需求,比如周末公司休息,但是公司网站的文章需要提前存入数据库,然后周六凌晨或者自定义一个时间发布出去;所以研究了一下然后做出来了,下面是我做的流程


一、我引进的jar包

         1、log4j-1.2.17

  2、quartz-2.2.1.jar

       3、quartz-jobs-2.2.1.jar

  3、slf4j-api-1.7.12.jar

  4、slf4j-log4j12-1.7.12.jar


二、流程和逻辑思路

    数据库新增一张表定时任务的表

   

   注释:表里面关键的是executetime(执行时间),articleid(文章编号)

    文章表存入的close字段的状态为1,前端不会展示

    将需要定时执行的任务都存入该表,并且任务的执行状态为1


   1: 配置文件的修改,在spring-context.xml中加入以下代码

                                                                                                                                                                                                                                         

    2:配置定时任务的bean

  

public class QuartzScheduleJob implements Serializable{/** serialVersionUID*/private static final long serialVersionUID = -929195342689371565L;public static final String STATUS_RUNNING = "1";public static final String STATUS_NOT_RUNNING = "0";public static final String CONCURRENT_IS = "1";public static final String CONCURRENT_NOT = "0";private Long id;private Date createtime;private Date updatetime;/** * 任务名称 */private String jobname;/** * 任务分组 */private String jobgroup;/** * 任务状态 是否启动任务 */private String jobstatus;/** * 任务执行时间 */private Date executetime;/** * 描述 */private String description;/** * 任务执行时调用哪个类的方法 包名+类名 */private String beanclass;/** * 任务是否有状态 */private String isconcurrent;/** * spring bean */private String springid;/** * 任务调用的方法名 */private String methodname;private Long articleid;//需要定时发送的文章idpublic Long getId() {return id;}public void setId(Long id) {this.id = id;}public Date getCreatetime() {return createtime;}public void setCreatetime(Date createtime) {this.createtime = createtime;}public Date getUpdatetime() {return updatetime;}public void setUpdatetime(Date updatetime) {this.updatetime = updatetime;}public String getJobname() {return jobname;}public void setJobname(String jobname) {this.jobname = jobname;}public String getJobgroup() {return jobgroup;}public void setJobgroup(String jobgroup) {this.jobgroup = jobgroup;}public String getJobstatus() {return jobstatus;}public void setJobstatus(String jobstatus) {this.jobstatus = jobstatus;}public Date getExecutetime() {return executetime;}public void setExecutetime(Date executetime) {this.executetime = executetime;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public String getBeanclass() {return beanclass;}public void setBeanclass(String beanclass) {this.beanclass = beanclass;}public String getIsconcurrent() {return isconcurrent;}public void setIsconcurrent(String isconcurrent) {this.isconcurrent = isconcurrent;}public String getSpringid() {return springid;}public void setSpringid(String springid) {this.springid = springid;}public String getMethodname() {return methodname;}public void setMethodname(String methodname) {this.methodname = methodname;}public Long getArticleid() {return articleid;}public void setArticleid(Long articleid) {this.articleid = articleid;}}
  

     3:dao层

public interface QuartzScheduleJobMapper {/** * 保存定时任务信息 *  * @param quartzScheduleJob * @return */public Long saveEntity(QuartzScheduleJob quartzScheduleJob);/** * 查询所有任务 *  * @return */public List findEntity();/** * 根据id删除数据 *  * @param jobId * @return */public int deleteByPrimaryKey(Long jobId);/** * 根据编号查询数据 *  * @param jobId * @return */public QuartzScheduleJob selectByPrimaryKey(Long jobId);/** * 修改数据 *  * @param record * @return */public int updateByPrimaryKey(QuartzScheduleJob record);/** * 查询状态为1的任务 *  * @return */public List findEntityByStatus();/** * 修改状态 *  * @param id * @param jobstatus */public void updateStatus(@Param("id")Long id,@Param("jobstatus") String jobstatus);}

    4:mapper.xml

INSERT INTO task_schedule_job(createtime,updatetime,jobname,jobgroup,jobstatus,executetime,description,beanclass,isconcurrent,springid,methodname,articleid) VALUES(#{createtime},#{updatetime},#{jobname},#{jobgroup},#{jobstatus},#{executetime},#{description},#{beanclass},#{isconcurrent},#{springid},#{methodname},#{articleid})id,createtime,updatetime,jobname,jobgroup,jobstatus,executetime,description,beanclass,isconcurrent,springid,methodname,articleidDELETE FROM task_schedule_jobWHERE WHERE id=#{jobId,jdbcType=BIGINT}UPDATE task_schedule_job SET jobstatus=#{jobstatus} WHERE id=#{id}UPDATE task_schedule_jobcreatetime=#{createtime},updatetime=#{updatetime},jobname=#{jobname},jobgroup=#{jobgroup},jobstatus=#{jobstatus},executetime=#{executetime},description=#{description},beanclass=#{beanclass},isconcurrent=#{isconcurrent},springid=#{springid},methodname=#{methodname},articleid=#{articleid},WHERE id=#{id}  

    5:service层

public interface QuartzScheduleJobService {/** * 查询所有的任务信息 *  * @return */public List findEntity();/** * 添加任务信息 *  * @param quartzScheduleJob */public void addTask(QuartzScheduleJob quartzScheduleJob);/** * 根据编号查询任务信息 *  * @param jobId * @return */public QuartzScheduleJob selectById(Long jobId);/** *  * 需要执行的任务 *  */public void executeTasks();}

    6:service实现类

@Service("quartzScheduleJobService")@Transactional(propagation=Propagation.REQUIRED, rollbackFor={RuntimeException.class})public class QuartzScheduleJobServiceImpl  implements QuartzScheduleJobService{public final Logger log = Logger.getLogger(this.getClass());//定时任务信息@Resourceprivate QuartzScheduleJobMapper quartzScheduleJobMapper;//文章@Resourceprivate ArticleMapper articleMapper;/** * 查询所有的任务信息 *  * @return */@Overridepublic List findEntity() {return quartzScheduleJobMapper.findEntity();}/** * 添加任务信息 *  * @param quartzScheduleJob */@Overridepublic void addTask(QuartzScheduleJob quartzScheduleJob) {quartzScheduleJob.setCreatetime(new Date());quartzScheduleJobMapper.saveEntity(quartzScheduleJob);}/** * 根据编号查询任务信息 *  * @param jobId * @return */@Override@Transactional(propagation=Propagation.SUPPORTS, readOnly = true)public QuartzScheduleJob selectById(Long jobId) {return quartzScheduleJobMapper.selectByPrimaryKey(jobId);}/** *  * 需要执行的任务 *  */@Overridepublic void executeTasks(){List joblist = quartzScheduleJobMapper.findEntityByStatus();for(QuartzScheduleJob job1:joblist){Date date = job1.getExecutetime();Date currentdate = new Date();//获取数据库的时间和当前时间做比较年月日相同  就进行修改if(DateUtils.isSameDay(currentdate, date)){articleMapper.updateClose(job1.getArticleid(), 0);quartzScheduleJobMapper.updateStatus(job1.getId(),"0");}//测试两个时间的分钟数是否相同/*if((date.getTime()/60000) == (currentdate.getTime()/60000)){articleMapper.updateClose(job1.getArticleid(), 0);quartzScheduleJobMapper.updateStatus(job1.getId(),"0");}*/}}}

    7:定时任务管理类

   

public class QuartzManager { private Scheduler scheduler;    /**   * @Description:启动所有定时任务  */      public void startJobs() {          try {              scheduler.start();          } catch (Exception e) {              throw new RuntimeException(e);          }      }         public Scheduler getScheduler() {        return scheduler;    }    public void setScheduler(Scheduler scheduler) {        this.scheduler = scheduler;    }}

    8:页面上选择是否为定时文章,如果选择是,则选择该文章定时发送的时间然后和其他值一起传到后台

    controller的方法里面判断

 

@Controller@RequestMapping("/admin")public class ArticleController {     // 文章@Resource(name = "articleService")private ArticleService articleService;//定时任务@Resource(name = "quartzScheduleJobService")private QuartzScheduleJobService quartzScheduleJobService;/** * 处理文章添加 *  * @param request 请求对象 * @param article 文章对象 * @param cateid  类别 * @param oid     姓氏编号 * @param upfile  上传文件对象 * @return        返回列表页面 */@RequestMapping(value = "/article_add", method = RequestMethod.POST)public String articleAddHandle(HttpServletRequest request,Article article,@RequestParam(required = true, defaultValue = "0") Long cateid,@RequestParam(required = true, defaultValue = "") String oid,@RequestParam(required = false, value = "upfile") MultipartFile upfile,@RequestParam(required = true, defaultValue = "") String tabid,@RequestParam(required = true, defaultValue = "") String quartztime)throws IOException {// 保存信息articleService.saveEntity(article);/*------------ 更新数据结束 ----------------------*///如果文章的close为1 说明是需要定时发送的文章if(article.getClose() == 1){QuartzScheduleJob job = new QuartzScheduleJob();job.setJobname(article.getTitle());Long articleid = article.getId();job.setArticleid(articleid);//设置任务运行时间表达式//quartztime  前端传过来的运行时间Date jodtime = DateUtil.stringToDate(quartztime, "yyyy-MM-dd");job.setExecutetime(jodtime);job.setJobgroup("0");job.setJobstatus("1");job.setIsconcurrent("0");job.setSpringid("quartzScheduleJobService");job.setBeanclass("com.jiuqin.information.service.impl.QuartzScheduleJobServiceImpl");job.setMethodname("executeTasks");//向数据库保存一条记录quartzScheduleJobService.addTask(job);}return "redirect:article_list.do?tabid=" + tabid + "&t=" + new Date().getTime();}

  注:有关于quartz的时间表达式的配置,百度就可以了