Quartz 使用时需要注意,它是将 对象序列化 掉,保存起来,符合时间条间时再取出来反序列化执行.那么,它就要求所有的操作对象是可序列化的.通常我们操作是通过 service 层来执行的,但是service显然是不可以序列化的,因此有两种思路 1 设置上下文对象,然后调用时取出 2 设置对象名称从Spring 中获取. 参考的例子中 2,3 分别用了这两个思路.
具体任务生成参考官方示例
quartz-2.2.3\examples\src\org\quartz\examples\example3\CronTriggerExample.java
自己实现的部分代码:
Job定义部分:
/**
* 用于定时任务(注意这里所有属性必需支持Serializable,否则会报错)
*
* @author zhouxianglh@gmail.com
*
* 2017年4月7日
*/
public abstract class YmtJob implements Job, Serializable {
/**
*
*/
private static final long serialVersionUID = -4226096330498705509L;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
run(dataMap);
}
任务生成部分:
JobDataMap jobData = new JobDataMap();
if (null != job.getMap()) {
jobData.putAll(job.getMap());
}
JobDetail jobDetail = JobBuilder.newJob(job.getClass()).setJobData(jobData)
.withIdentity(JobKey.jobKey(job.getKey())).build();
//
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(TriggerKey.triggerKey(job.getKey()))
.withSchedule(CronScheduleBuilder.cronSchedule(job.getCronExpression())).build();
//
Scheduler scheduler = schedulerFactoryBean.getScheduler();
scheduler.scheduleJob(jobDetail, trigger);
任务执行
@Override
public void run(JobDataMap dataMap) {
TaskBiz taskBiz = SpringContex.getBean("taskBiz");
BillUnit billUnit = SpringContex.getBean("billUnit");
TaskPrePick prePick = billUnit.getPrePickById(id);
WmsTask task = new WmsTask();
task.setBillid(id);
task.setTaskdesc("根据收货单生成收货任务");
task.setLevel(0);
task.setType(7);
task.setWhCode(prePick.getWhCode());
taskBiz.addTask(task);
}
参考:
http://www.quartz-scheduler.org/documentation/quartz-2.1.x/quick-start.html
http://blog.csdn.net/zjx86320/article/details/52346187
http://fanshuyao.iteye.com/blog/2309702