业务场景:设定好的优惠卷在开始的时候推送给合适的用户
延时任务控件: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.如果只执行一次的任务记得销毁