实践Quartz定时任务方式大全(获得spring中的bean)

转载地址: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 >

注意上述红色字体<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


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

业务代码如下:

 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

注意:在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 >


以上就是结合Spring使用Quartz编写定时任务两种方式,Spring很好的封装使用Quartz的细节,第一种方式是利用SPring封装的Quartz类进行特定方法的实现,第二种是通过透明的使用Quartz达到定时任务开发的目的,总体说第二种对开发人员更方便!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值