您的位置:首页 > 编程语言 > Java开发

quartz学习使用心得(3)之spring与Quartz的整合

2018-03-30 14:16 656 查看
spring与Quartz的整合需要导入Quartz jar包,在maven中导入,方法我就不列出来了,就是在pom引入依赖,不知道的话可以查查别的资料。
整合后xml的配置文件的两种方式:
MethodInvokingJobDetailFactoryBean  调用特定bean的某个特定方法
例如:
<!-- ***********使用MethodInvokingJobDetailFactory****调用特定bean的某个特定方法****start***************-->
<bean id="myJob" class="com.quartz.springANDQuartz.MyJob"/>
<bean id="myJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="myJob"/>
<property name="targetMethod" value="myMethod"/>
</bean>
<bean name="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<!--指定trigger的名称-->
<property name="name" value="hw_trigger"/>
<!--指定trigger的分组-->
<property name="group" value="hw_trigger_group"/>
<!--指定Trigger绑定的Job-->
<property name="jobDetail" ref="myJobDetail"/>
<!--<property name="jobDetail" ref="hwJob"/>-->
<!--指定cron的表达式,当前是每隔1分钟运行一次0 0/1 * * * ?-->
<property name="cronExpression" value="* * * * * ?"/>
</bean>

<!--3.定义调度器,并将Trigger注册到调度器中-->
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!--<property name="jobFactory" ref="jobFactory"/>-->
<property name="jobDetails" ref="myJobDetail"/>
<property name="triggers">
<list>
<!--<ref bean="simplTrigger"/>-->
<ref bean="cronTrigger"/>
</list>
</property>
</bean>
<!-- ***********使用MethodInvokingJobDetailFactory****调用特定bean的某个特定方法****end***************-->
@Component("myJob")
public class MyJob {
public void myMethod(){
System.out.println("啦啦啦 春天来啦~ 该出去玩儿啦~~~~");
}
}使用JobDetailFactoryBean调用某个任务类
例如:
<!-- ************使用JobDetailFactoryBean***********调用某个任务类****start****************************-->
<bean id="jobFactory" class="com.gao.ssm.module.quartz.MyJobFactory"/>
<!--
Spring整合Quartz进行配置遵循下面的步骤:
1:定义工作任务Job
2:定义触发器Trigger,并将触发器与工作任务绑定
3:定义调度器,并将Trigger注册到Scheduler
-->
<!--1:定义任务的bean,这使用JobDetailFactoryBean,-->
<bean name="hwJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<!--指定job的名称-->
<property name="name" value="hw_job"/>
<!--指定job的分组-->
<property name="group" value="hw_group"/>
<property name="jobClass" value="com.gao.ssm.module.quartz.AutoInitCount"/>
<!--必须设置为true,如果为false,当没有活动的触发器与之关联时会在调度器中删除该任务-->
<property name="durability" value="true"/>
<!--指定spring容器的key,如果不设定在job中的jobMap中是获取不到spring容器的-->
<property name="applicationContextJobDataKey" value="applicationContext"/>
</bean>
<!--2.1:定义触发器的bean,定义一个Simple的Trigger,一个触发器只能和一个任务进行绑定-->
<!--<bean name="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">-->
<!--指定trigger的名称-->
<!--<property name="name" value="hw_trigger"/>-->
<!--指定trigger的分组-->
<!--<property name="group" value="hw_trigger_group"/>-->
<!--指定Trigger绑定的Job-->
<!--<property name="jobDetail" ref="hwJob"/>-->
<!--指定Trigger的延迟时间1s后运行-->
<!--<property name="startDelay" value="1000"/>-->
<!--指定trigger的重复间隔 5s-->
<!--<property name="repeatInterval" value="5000"/>-->
<!--指定trigger的重复次数-->
<!--<property name="repeatCount" value="5"/>-->
<!--</bean>-->
<!--2.2:定义触发器的bean,定义一个Cron的Trigger,一个触发器只能和一个任务进行绑定-->
<bean name="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<!--指定trigger的名称-->
<property name="name" value="hw_trigger"/>
<!--指定trigger的分组-->
<property name="group" value="hw_trigger_group"/>
<!--指定Trigger绑定的Job-->
<property name="jobDetail" ref="hwJob"/>
<!--指定cron的表达式,当前是每隔1分钟运行一次-->
<property name="cronExpression" value="0 0/1 * * * ?"/>
</bean>

<!--3.定义调度器,并将Trigger注册到调度器中-->
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!--<property name="jobFactory" ref="jobFactory"/>-->
<property name="jobFactory" ref="jobFactory"/>
<property name="triggers">
<list>
<!--<ref bean="simplTrigger"/>-->
<ref bean="cronTrigger"/>
</list>
</property>
</bean>
<!-- ************使用JobDetailFactoryBean***********调用某个任务类****end****************************-->任务类:这个是我的项目的一部分,要是想测试这个demo的话可以把方法体改成简单的语句输出就好。
/**
* @description quartz定时器--项目启动自动载入日志访问量
* @author: gaobh
* @date: 2018/3/27 11:26
* @version: v1.0
*/
@Service
public class AutoInitCount implements Job {
Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private LogsService logsService;
@Autowired
private TimerRunService timerRunService;

@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
logger.error("---------quartz start------");
timerRunService.saveCount();
}

}

由于任务类里面需要注入service,而quartz会使spring注入失败,故找到解决方案如下:
/**
* @description
* @author: gaobh
* @date: 2018/3/27 13:38
* @version: v1.0
*/
public class MyJobFactory extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory autowireCapableBeanFactory;

@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
//调用父类的方法
Object jobInstance = super.createJobInstance(bundle);
//进行注入,这属于Spring的技术,不清楚的可以查看Spring的API.
autowireCapableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}同时在配置中加入MyJobFactory的注入
<bean id="jobFactory" class="com.gao.ssm.module.quartz.MyJobFactory"/>在调度器中注册任务的时候并不是直接将任务bean注册进来,而是注册这个MyJobFactory类来解决service注入失败的问题。
(有一篇文章专门讲解注入失败的问题,若想知道原理请移步。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: