Quartz定时任务

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


一、我引进的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;//需要定时发送的文章id
	public 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,articleid
	
	
	
  • SELECT FROM task_schedule_job
  • SELECT FROM task_schedule_job WHERE jobstatus=1
  • SELECT FROM task_schedule_job WHERE id=#{jobId,jdbcType=BIGINT} DELETE FROM task_schedule_job WHERE WHERE id=#{jobId,jdbcType=BIGINT} UPDATE task_schedule_job SET jobstatus=#{jobstatus} WHERE id=#{id} UPDATE task_schedule_job createtime=#{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());
    	//定时任务信息
    	@Resource
    	private QuartzScheduleJobMapper quartzScheduleJobMapper;
    	//文章
    	@Resource
    	private ArticleMapper articleMapper;
    	/**
    	 * 查询所有的任务信息
    	 * 
    	 * @return
    	 */
    	@Override
    	public List findEntity() {
    		return quartzScheduleJobMapper.findEntity();
    	}
    	/**
    	 * 添加任务信息
    	 * 
    	 * @param quartzScheduleJob
    	 */
    	@Override
    	public 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);
    	}
    
    	/**
    	 * 
    	 * 需要执行的任务
    	 * 
    	 */
    	@Override
    	public 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的时间表达式的配置,百度就可以了






    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
    红包 添加红包
    表情包 插入表情
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值