最近在写定时任务,以前没接触过。查了些相关资料说使用quartz定时框架。
需要配置文件:config-quartz.xml
相关配置如下(红色部分是之后添加的,在后面步骤会说明):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
<? xml version = "1.0" encoding = "UTF-8" ?>
< beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:context = "http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd">
< bean id = "scheduler" class = "org.springframework.scheduling.quartz.SchedulerFactoryBean" >
< property name = "schedulerName" value = "rqmis" ></ property >
< property name = "applicationContextSchedulerContextKey" value = "applicationContextKey" />
< property name = "configLocation" value = "classpath:quartz.properties" />
< property name = "autoStartup" value = "true" ></ property >
< property name = "triggers" >
< list >
< bean class = "org.springframework.scheduling.quartz.CronTriggerFactoryBean" >
< property name = "cronExpression" value = "0 0 0 * * ?" ></ property >
< property name = "jobDetail" >
< bean class = "org.springframework.scheduling.quartz.JobDetailFactoryBean" >
< property name = "jobClass" value = "com.wy.care60.job.HealthPlanJob" />
</ bean >
</ property >
</ bean >
</ list >
</ property >
</ bean >
<!--</property>
</bean>-->
</ beans >
|
quartz.properties
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
#============================================================================
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName = WrhFrameScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.skipUpdateCheck = true
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool. class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 12
org.quartz.threadPool.threadPriority = 5
#============================================================================
# Configure JobStore
#============================================================================
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore. class = org.quartz.simpl.RAMJobStore
#org.quartz.jobStore. class = org.quartz.impl.jdbcjobstore.JobStoreTX
#org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
#org.quartz.jobStore.useProperties = false
#org.quartz.jobStore.dataSource = myDS
#org.quartz.jobStore.tablePrefix = QRTZ_
#org.quartz.jobStore.isClustered = false
#============================================================================
# Configure Datasources
#============================================================================
#org.quartz.dataSource.myDS.driver = org.postgresql.Driver
#org.quartz.dataSource.myDS.URL = jdbc:postgresql: //localhost/dev
#org.quartz.dataSource.myDS.user = jhouse
#org.quartz.dataSource.myDS.password =
#org.quartz.dataSource.myDS.maxConnections = 5
|
最后spring-mvc.xml配置文件中奖quartz.xml文件引入即可:
<import resource="config-quartz.xml"></import>
然后写测试类开始测试定时任务:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
package com.wy.care60.job;
import com.wy.care60.dao.MElementMapper;
import com.wy.care60.dao.MInterEnumMapper;
import com.wy.care60.dao.MProjectMapper;
import com.wy.care60.model.MInterEnum;
import com.wy.care60.model.MProject;
import org.apache.tools.ant.Project;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
/**
* Created by Administrator on 2017/12/20.
*/
@Component
public class HealthPlanJob extends QuartzJobBean {
@Autowired
MProjectMapper mProjectMapper;
@Override
public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println( new Date());
}
}
|
发现时间可以打印出来,证明定时任务成功开启;但是同时也发现了一个问题,就是依赖注入的 mProjectMapper值为null。
开始以为是Spring的原因,导致注解失败,后来查了相关资料发现,不是Spring的原因,而是因为:这个Job是由quartz实例化出来的,不受Spring的管理,所以就导致注入失败。解决办法是自己new一个类,让Spring实例化这个类,代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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;
public class MyJobFactory extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
//调用父类的方法
Object jobInstance = super .createJobInstance(bundle);
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
|
然后把这个类配置到Spring中去,(config-quartz.xml中红色部分)
<bean id="jobFactory" class="com.wy.care60.job.MyJobFactory"></bean>
然后在把org.springframework.scheduling.quartz.SchedulerFactoryBean的jobFactory设置成我们自己的。(config-quartz.xml中红色部分)
1
2
3
4
|
< bean name = "MyScheduler" class = "org.springframework.scheduling.quartz.SchedulerFactoryBean" >
<!-- 其他属性省略 -->
< property name = "jobFactory" ref = "jobFactory" ></ property >
</ bean >
|
config-quartz.xml完整版如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
<? xml version = "1.0" encoding = "UTF-8" ?>
< beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:context = "http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd">
< bean id = "jobFactory" class = "com.wy.care60.job.MyJobFactory" ></ bean >
< bean id = "scheduler" class = "org.springframework.scheduling.quartz.SchedulerFactoryBean" >
< property name = "schedulerName" value = "rqmis" ></ property >
< property name = "applicationContextSchedulerContextKey" value = "applicationContextKey" />
< property name = "configLocation" value = "classpath:quartz.properties" />
< property name = "autoStartup" value = "true" ></ property >
< property name = "jobFactory" ref = "jobFactory" ></ property >
< property name = "triggers" >
< list >
< bean class = "org.springframework.scheduling.quartz.CronTriggerFactoryBean" >
< property name = "cronExpression" value = "0 0 0 * * ?" ></ property >
< property name = "jobDetail" >
< bean class = "org.springframework.scheduling.quartz.JobDetailFactoryBean" >
< property name = "jobClass" value = "com.wy.care60.job.HealthPlanJob" />
</ bean >
</ property >
</ bean >
</ list >
</ property >
</ bean >
<!--</property>
</bean>-->
</ beans >
|
到这为止,成功!
以上这篇JAVA使用quartz添加定时任务,并依赖注入对象操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/Sometimes__/article/details/78864126