最近在寫定時任務,以前沒接觸過。查了些相關資料說使用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