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.如果只执行一次的任务记得销毁

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加班狂魔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值