Spring+Quartz实现任务动态管理监控
环境:Quartz2.2.3+Spring4.0
- 配置文件很简单,只需要一个配置就可以了,注入一个FactoryBean.
<!-- 任务工厂,注入需注入scheduler -->
<bean id="schedulerFactoryBean"class="org.springframework.scheduling.quartz.SchedulerFactoryBean" />
<!-- 注册SpringContextUtil用于获取ApplicationContext -->
<bean id="springContextUtil" class="com.hmj.service.quartz.SpringContextUtil"></bean>
- Job的实体类(省略GETTER)
private Integer id;
/**
* 任务名称
*/
private String job_name;
/**
* 任务内容
*/
private String job_content;
/**
* 表达式
*/
private String cron_expression;
/**
* 是否并发
*/
private String concurrent;
/**
* 任务分组
*/
private String job_group;
/**
* 调用类
*/
private String target_object;
/**
* 调用类的方法
*/
private String target_method;
/**
* 子任务
*/
private String childJobs;
/**
* 任务状态
*/
private Byte job_status;
/**
* 任务运行状态
*/
private Byte running_status;
/**
* 任务开始时间
*/
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date start_time;
/**
* 任务结束时间
*/
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date end_time;
- 无实现Job的加上这个注解即可,可以动态添加Job,不用写死!
@DisallowConcurrentExecution//无实现
- 重点的Quartz管理的Service,作为Spring的Service,这里也可以设置并发,默认是不并发,如果需要并发,就加一个字段,然后添加的时候设置并发为true就行了。
@Service
public class QuartzServiceImpl implements QuartzService {
//这里注入Scheduler,不能注入schedulerFactoryBean
@Resource
private Scheduler scheduler ;
@Override
public Scheduler getScheduler() {
return scheduler;
}
@Resource
private WyFeeJobDao wyFeeJobDao;
/**
* 开启所有任务
*/
@Override
public void startJobs() {
try {
scheduler.start();
} catch (SchedulerException e) {
throw new RuntimeException(e);
}
}
@Override
public boolean addJob(WyFeeJobPO job) throws Exception {
boolean flag = false;
CronTrigger cronTrigger = checkTrigger(job);
// 不存在该任务的触发器
if (cronTrigger == null) {
// 新建一个基于Spring的管理Job类
MethodInvokingJobDetailFactoryBean methodInvJobDetailFB = new MethodInvokingJobDetailFactoryBean();
methodInvJobDetailFB.setName(job.getJob_name());
methodInvJobDetailFB.setGroup(job.getJob_group());
//设置任务类(这里的任务类是交给Spring管理的Bean,如果不是Spring的Bean,需要类的全路径)
methodInvJobDetailFB.setTargetObject( SpringContextUtil.getApplicationContext().getBean(job.getTarget_object()));
//设置任务方法
methodInvJobDetailFB.setTargetMethod(job.getTarget_method());
// 将管理Job类提交到计划管理类
methodInvJobDetailFB.afterPropertiesSet();
JobDetail jobDetail = methodInvJobDetailFB.getObject();
jobDetail.getJobDataMap().put(job.getJob_name(), job);
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule