实践Quartz定时任务方式大全(获得spring中的bean)
最近需要用到Quartz进行定时任务功能,通过近期研究发现,spring已经很好的集成Quartz,它主要是屏蔽了Quartz底层一些配置,使开发人员可以几乎不受到任何限制就能够利用Quartz进行定时任务的工作,这里主要是通过实例的方式对利用Spring进行Quartz定时开发的两种方式进行讲解。1、功能需求 需要每个30秒对系统指定目录进行扫描,把符合条件的文件进行解析入库工
·
转载地址:http://www.blogjava.net/wuxj888java/archive/2008/01/09/173951.html#Post
最近需要用到Quartz进行定时任务功能,通过近期研究发现,spring已经很好的集成Quartz,它主要是屏蔽了Quartz底层一些配置,使开发人员可以几乎不受到任何限制就能够利用Quartz进行定时任务的工作,这里主要是通过实例的方式对利用Spring进行Quartz定时开发的两种方式进行讲解。
1、功能需求
需要每个30秒对系统指定目录进行扫描,把符合条件的文件进行解析入库工作,这里只提取出有关顶事任务的内容
2、研究一下Spring+Quartz结合方式,大体有两种方式可以达到定时任务功能
2.1 借助于Spring的org.springframework.scheduling.quartz.JobDetailBean的类功能,继承Spring封装Quartz的org.springframework.scheduling.quartz.QuartzJobBean类,要实现executeInternal方法,并把其中涉及到需要定时任务处理的功能放入其中
Spring配置如下:
1
2
< bean id ="saveProjectJob"
3
class ="org.springframework.scheduling.quartz.JobDetailBean" >
4
< property name ="jobClass" >
5
< value >
6
com.gresoft.components.fileupload.service.ParseFileQuartz
7
</ value >
8
</ property >
9
< property name ="jobDataAsMap" >
10
<map>
11
<entry key="readXmlService">
12
<ref bean="readXmlService" />
13
</entry>
14
</map>
15
</ property >
16
</ bean >
17
< bean id ="saveCron"
18
class ="org.springframework.scheduling.quartz.CronTriggerBean" >
19
< property name ="jobDetail" >
20
< ref local ="saveProjectJob" />
21
</ property >
22
< property name ="cronExpression" >
23
< value > 0/30 * * * * ? </ value >
24
</ property >
25
</ bean >
26
< bean id ="scheduler"
27
class ="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
28
< property name ="triggers" >
29
< ref local ="saveCron" />
30
</ property >
31
</ bean >
2
< bean id ="saveProjectJob" 3
class ="org.springframework.scheduling.quartz.JobDetailBean" > 4
< property name ="jobClass" > 5
< value > 6
com.gresoft.components.fileupload.service.ParseFileQuartz7
</ value > 8
</ property > 9
< property name ="jobDataAsMap" > 10
<map>11
<entry key="readXmlService">12
<ref bean="readXmlService" />13
</entry>14
</map>15
</ property > 16
</ bean > 17
< bean id ="saveCron" 18
class ="org.springframework.scheduling.quartz.CronTriggerBean" > 19
< property name ="jobDetail" > 20
< ref local ="saveProjectJob" /> 21
</ property > 22
< property name ="cronExpression" > 23
< value > 0/30 * * * * ? </ value > 24
</ property > 25
</ bean > 26
< bean id ="scheduler" 27
class ="org.springframework.scheduling.quartz.SchedulerFactoryBean" > 28
< property name ="triggers" > 29
< ref local ="saveCron" /> 30
</ property > 31
</ bean >
注意上述红色字体<map>结点,这里主要是为了在定时任务需要使用到Bean,通过Spring给注入进来,如果不写明,就会报
java.lang.NullPointerException错误,主要是因为没有注入Bean
方法代码如下:
1
package com.gresoft.components.fileupload.service;
2
3
import org.quartz.JobExecutionContext;
4
import org.quartz.JobExecutionException;
5
import org.springframework.scheduling.quartz.QuartzJobBean;
6
7
public class ParseFileQuartz extends QuartzJobBean {
8
private readXmlService readXmlService;
9
10
@Override
11
protected void executeInternal(JobExecutionContext jobexecutioncontext)
12
throws JobExecutionException {
13
// TODO Auto-generated method stub
14
// System.out.println(genderManager.get(1).getGenderName());
15
readXmlService.refreshFileList("D:/tomcat/webapps/sanitation/upload");
16
}
17
18
public void setReadXmlService(readXmlService readXmlService) {
19
this.readXmlService = readXmlService;
20
}
21
}
22
package com.gresoft.components.fileupload.service;2

3
import org.quartz.JobExecutionContext;4
import org.quartz.JobExecutionException;5
import org.springframework.scheduling.quartz.QuartzJobBean;6

7
public class ParseFileQuartz extends QuartzJobBean {8
private readXmlService readXmlService;9

10
@Override11
protected void executeInternal(JobExecutionContext jobexecutioncontext)12
throws JobExecutionException {13
// TODO Auto-generated method stub14
// System.out.println(genderManager.get(1).getGenderName());15
readXmlService.refreshFileList("D:/tomcat/webapps/sanitation/upload");16
}17

18
public void setReadXmlService(readXmlService readXmlService) {19
this.readXmlService = readXmlService;20
}21
} 22
2.2 借助于Spring 的org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean类,使用此方法使开发人员对Quartz完全透明,需要实现定时任务的方法只是一个普通方法
Spring配置文件如下:
1
<? xml version="1.0" encoding="UTF-8" ?>
2
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" >
3
< beans >
4
5
< bean id ="saveProjectJob"
6
class ="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" >
7
< property name ="targetObject" >
8
< ref local ="parseQuartz" />
9
10
</ property >
11
< property name ="targetMethod" >
12
< value > execute </ value >
13
</ property >
14
15
16
</ bean >
17
< bean id ="parseQuartz" class ="com.gresoft.components.fileupload.service.ParseFileQuartzOther" >
18
< property name ="readXmlService" ref ="readXmlService" />
19
</ bean >
20
< bean id ="saveCron"
21
class ="org.springframework.scheduling.quartz.CronTriggerBean" >
22
< property name ="jobDetail" >
23
< ref local ="saveProjectJob" />
24
</ property >
25
< property name ="cronExpression" >
26
< value > 0/30 * * * * ? </ value >
27
</ property >
28
</ bean >
29
< bean id ="scheduler"
30
class ="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
31
< property name ="triggers" >
32
< ref local ="saveCron" />
33
</ property >
34
</ bean >
35
<? xml version="1.0" encoding="UTF-8" ?> 2
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" > 3
< beans > 4

5
< bean id ="saveProjectJob" 6
class ="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" > 7
< property name ="targetObject" > 8
< ref local ="parseQuartz" /> 9

10
</ property > 11
< property name ="targetMethod" > 12
< value > execute </ value > 13
</ property > 14

15

16
</ bean > 17
< bean id ="parseQuartz" class ="com.gresoft.components.fileupload.service.ParseFileQuartzOther" > 18
< property name ="readXmlService" ref ="readXmlService" /> 19
</ bean > 20
< bean id ="saveCron" 21
class ="org.springframework.scheduling.quartz.CronTriggerBean" > 22
< property name ="jobDetail" > 23
< ref local ="saveProjectJob" /> 24
</ property > 25
< property name ="cronExpression" > 26
< value > 0/30 * * * * ? </ value > 27
</ property > 28
</ bean > 29
< bean id ="scheduler" 30
class ="org.springframework.scheduling.quartz.SchedulerFactoryBean" > 31
< property name ="triggers" > 32
< ref local ="saveCron" /> 33
</ property > 34
</ bean > 35
业务代码如下:
1
package com.gresoft.components.fileupload.service;
2
3
public class ParseFileQuartzOther {
4
private readXmlService readXmlService;
5
6
7
public void execute(){
8
// TODO Auto-generated method stub
9
// System.out.println(genderManager.get(1).getGenderName());
10
readXmlService.refreshFileList("D:/tomcat/webapps/sanitation/upload");
11
}
12
13
public void setReadXmlService(readXmlService readXmlService) {
14
this.readXmlService = readXmlService;
15
}
16
}
17
package com.gresoft.components.fileupload.service;2

3
public class ParseFileQuartzOther {4
private readXmlService readXmlService;5

6

7
public void execute(){8
// TODO Auto-generated method stub9
// System.out.println(genderManager.get(1).getGenderName());10
readXmlService.refreshFileList("D:/tomcat/webapps/sanitation/upload");11
}12

13
public void setReadXmlService(readXmlService readXmlService) {14
this.readXmlService = readXmlService;15
}16
} 17
注意:在Spring配置和Quartz集成内容时,有两点需要注意
1、在<Beans>中不能够设置default-lazy-init="true",否则定时任务不触发,如果不明确指明default-lazy-init的值,默认是false。
2、在<Beans>中不能够设置default-autowire="byName"的属性,否则后台会报org.springframework.beans.factory.BeanCreationException错误,这样就不能通过Bean名称自动注入,必须通过明确引用注入。
比如上例中的parseQuartz就是明确声明注入的方式
1
< bean id ="parseQuartz" class ="com.gresoft.components.fileupload.service.ParseFileQuartzOther" >
2
< property name ="readXmlService" ref ="readXmlService" />
3
</ bean >
< bean id ="parseQuartz" class ="com.gresoft.components.fileupload.service.ParseFileQuartzOther" > 2
< property name ="readXmlService" ref ="readXmlService" /> 3
</ bean >
以上就是结合Spring使用Quartz编写定时任务两种方式,Spring很好的封装使用Quartz的细节,第一种方式是利用SPring封装的Quartz类进行特定方法的实现,第二种是通过透明的使用Quartz达到定时任务开发的目的,总体说第二种对开发人员更方便!
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)