Quartz延时任务实现

业务场景:设定好的优惠卷在开始的时候推送给合适的用户

延时任务控件:Quartz

框架:SpringMVC + Spring + MyBatis


1.Quartz引入

    所需jar包:quartz-openejb-shade-2.2.1.jar

2.Task类实现

package com.its.modules.task;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.openejb.quartz.Job;
import org.apache.openejb.quartz.JobExecutionContext;
import org.apache.openejb.quartz.JobExecutionException;
import org.apache.openejb.quartz.Scheduler;
import org.apache.openejb.quartz.SchedulerException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.its.common.utils.DateUtils;
import com.its.common.utils.SpringContextHolder;
import com.its.common.web.BaseController;
import com.its.modules.account.entity.Account;
import com.its.modules.account.service.AccountService;
import com.its.modules.operation.entity.CouponManage;
import com.its.modules.operation.entity.CouponManageUsers;
import com.its.modules.operation.entity.MemberDiscount;
import com.its.modules.operation.service.CouponManageService;
import com.its.modules.operation.service.CouponManageUsersService;
import com.its.modules.operation.service.MemberDiscountService;
import com.its.modules.sys.service.SysCodeMaxService;

/**
 * 优惠卷推送任务
 *
 * @author Liuhl
 *
 */
public class CouponTask extends BaseController implements Job {

    /** 日志对象 */
    protected Logger logger = LoggerFactory.getLogger(getClass());

    /** 优惠卷管理service */
    private CouponManageService couponManageService = SpringContextHolder.getBean(CouponManageService.class);

    private CouponManageUsersService couponManageUsersService = SpringContextHolder.getBean(CouponManageUsersService.class);

    private SysCodeMaxService sysCodeMaxService = SpringContextHolder.getBean(SysCodeMaxService.class);

    private MemberDiscountService memberDiscountService = SpringContextHolder.getBean(MemberDiscountService.class);

    private AccountService accountService = SpringContextHolder.getBean(AccountService.class);

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        logger.warn("---------优惠卷推送开始----优惠卷ID:-----------" + context.getJobDetail().getKey().getName());

        try {
            // 业务逻辑

            // 调度销毁
            Scheduler scheduler = context.getScheduler();
            scheduler.deleteJob(context.getJobDetail().getKey());
            logger.warn("---------优惠卷推送任务销毁----优惠卷ID:-----------" + context.getJobDetail().getKey().getName());
            scheduler.shutdown();
            logger.warn("---------优惠卷推送正常结束----优惠卷ID:-----------" + context.getJobDetail().getKey().getName());
        } catch (SchedulerException e) {
            logger.warn("---------优惠卷推送异常----优惠卷ID:-----------" + context.getJobDetail().getKey().getName());
            e.printStackTrace();
        } catch (ParseException e) {
            logger.warn("---------优惠卷推送异常----优惠卷ID:-----------" + context.getJobDetail().getKey().getName());
            e.printStackTrace();
        }

    }
}

3.调用Task代码实现

  /**************** 启动定时任务,执行优惠券推送 ****************/
  JobDetail job = JobBuilder.newJob(CouponTask.class).withIdentity(couponManage.getId(), "CouponTaskGroup")
    .build();
  Trigger trigger = TriggerBuilder.newTrigger().withIdentity(couponManage.getId() + "_Trigger", "CouponTaskGroup")
    // .withSchedule(CronScheduleBuilder.cronSchedule("55 51 10 5 9
    // ? 2017")).build();
    .withSchedule(CronScheduleBuilder.cronSchedule("5 * * * * ?")).build();
  Scheduler scheduler = new StdSchedulerFactory().getScheduler();
  scheduler.start();
  scheduler.scheduleJob(job, trigger);

4.注意点

      1.quartz所管理的Task,spring无法管理,所以直接使用@Autowired注入Service的话会是null.故需要SpringContextHolder.getBean的形式

      2.cronSchedule表达式为秒 分 时 日 月 周 年

             "55 51 10 5 9 ? 2017" 这个代表 2017年9月5日10点51分55秒执行

   "5 * * * * ?" 这个代表每5秒执行

  3.如果只执行一次的任务记得销毁

你可能感兴趣的:(quartz)