系统需要实现一个任务调度管理的模块,具体要求:
1、能够动态增删改任务进行任务调度,不需要重启服务
2、与Spring配合,实现bean自动注入
3、能够手动触发某个任务立即执行
4、能够记录每个任务的执行开始、结束时间,执行结果,操作人(如果是立即执行时,需要记录操作人,如果是定时触发,记录为SYSTEM)
实现时遇到的难点:
1、将quartz的类与spring结合,能够自动注入到spring
2、记录job执行日志时,需要灵活的记录一些内容,通过jobDataMap来进行数据传递
具体实现步骤:
0、依赖quartz包、spring包、spring-support包等
1、为了能够使用Spring的IOC自动注入,在spring-context文件中配置SchedulerFactoryBean对象
注意,此处用的是springframwork提供的封装好的factorybean
<!-- 定时任务调度 -->
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobFactory" ref="jobFactory"></property>
<!-- 指定全局任务监听器,用以记录任务执行日志 -->
<property name="globalJobListeners">
<list>
<ref bean="simpleJobListener"></ref>
</list>
</property>
</bean>
<!-- END -->
说明:其中jobFactory为扩展AdaptableJobFactory的类,目的是为了使Job的具体实现类能够使用注入到spring中
具体实现为:
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.stereotype.Component;
/**
* @author
* @date Created time: 2019年10月22日 下午2:39:14
*
*/
@Component
public class JobFactory extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
// 调用父类方法
Object jobInstance =