溫暖潔森

          勇敢做自己

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            13 隨筆 :: 1 文章 :: 70 評(píng)論 :: 0 Trackbacks
               最近需要用到Quartz進(jìn)行定時(shí)任務(wù)功能,通過(guò)近期研究發(fā)現(xiàn),spring已經(jīng)很好的集成Quartz,它主要是屏蔽了Quartz底層一些配置,使開(kāi)發(fā)人員可以幾乎不受到任何限制就能夠利用Quartz進(jìn)行定時(shí)任務(wù)的工作,這里主要是通過(guò)實(shí)例的方式對(duì)利用Spring進(jìn)行Quartz定時(shí)開(kāi)發(fā)的兩種方式進(jìn)行講解。

          1、功能需求

            需要每個(gè)30秒對(duì)系統(tǒng)指定目錄進(jìn)行掃描,把符合條件的文件進(jìn)行解析入庫(kù)工作,這里只提取出有關(guān)頂事任務(wù)的內(nèi)容

          2、研究一下Spring+Quartz結(jié)合方式,大體有兩種方式可以達(dá)到定時(shí)任務(wù)功能

          2.1 借助于Spring的org.springframework.scheduling.quartz.JobDetailBean的類功能,繼承Spring封裝Quartz的org.springframework.scheduling.quartz.QuartzJobBean類,要實(shí)現(xiàn)executeInternal方法,并把其中涉及到需要定時(shí)任務(wù)處理的功能放入其中


          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>結(jié)點(diǎn),這里主要是為了在定時(shí)任務(wù)需要使用到Bean,通過(guò)Spring給注入進(jìn)來(lái),如果不寫明,就會(huì)報(bào)
          java.lang.NullPointerException錯(cuò)誤,主要是因?yàn)闆](méi)有注入Bean


          方法代碼如下:

           1package com.gresoft.components.fileupload.service;
           2
           3import org.quartz.JobExecutionContext;
           4import org.quartz.JobExecutionException;
           5import org.springframework.scheduling.quartz.QuartzJobBean;
           6
           7public 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類,使用此方法使開(kāi)發(fā)人員對(duì)Quartz完全透明,需要實(shí)現(xiàn)定時(shí)任務(wù)的方法只是一個(gè)普通方法

          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

          業(yè)務(wù)代碼如下:

           1package com.gresoft.components.fileupload.service;
           2
           3public 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集成內(nèi)容時(shí),有兩點(diǎn)需要注意
          1、在<Beans>中不能夠設(shè)置default-lazy-init="true",否則定時(shí)任務(wù)不觸發(fā),如果不明確指明default-lazy-init的值,默認(rèn)是false。
          2、在<Beans>中不能夠設(shè)置default-autowire="byName"的屬性,否則后臺(tái)會(huì)報(bào)org.springframework.beans.factory.BeanCreationException錯(cuò)誤,這樣就不能通過(guò)Bean名稱自動(dòng)注入,必須通過(guò)明確引用注入。

          比如上例中的parseQuartz就是明確聲明注入的方式

          1<bean id="parseQuartz" class="com.gresoft.components.fileupload.service.ParseFileQuartzOther">
          2        <property name="readXmlService" ref="readXmlService" />
          3    </bean>

          具體錯(cuò)誤信息如下:

          org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scheduler' defined in file [D:\workspace1\sanitation\web\WEB-INF\classes\spring\quartz.xml]: Invocation of init method failed; nested exception is org.quartz.SchedulerConfigException: Failure occured during job recovery. [See nested exception: org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: DB2 SQL error: SQLCODE: -204, SQLSTATE: 42704, SQLERRMC: DB2ADMIN.QRTZ_LOCKS [See nested exception: com.ibm.db2.jcc.b.SqlException: DB2 SQL error: SQLCODE: -204, SQLSTATE: 42704, SQLERRMC: DB2ADMIN.QRTZ_LOCKS]]
              at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1362)
              at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:
          540)
              at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$
          1.run(AbstractAutowireCapableBeanFactory.java:485)
              at java.security.AccessController.doPrivileged(Native Method)
              at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:
          455)
              at org.springframework.beans.factory.support.AbstractBeanFactory$
          1.getObject(AbstractBeanFactory.java:251)
              at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:
          169)
              at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:
          248)
              at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:
          170)
              at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:
          407)
              at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:
          735)
              at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:
          369)
              at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:
          251)
              at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:
          190)
              at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:
          45)
              at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:
          3764)
              at org.apache.catalina.core.StandardContext.start(StandardContext.java:
          4216)
              at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:
          1014)
              at org.apache.catalina.core.StandardHost.start(StandardHost.java:
          736)
              at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:
          1014)
              at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:
          443)
              at org.apache.catalina.startup.Embedded.start(Embedded.java:
          822)
              at EmbeddedTomcat.startTomcat(EmbeddedTomcat.java:
          85)
              at EmbeddedTomcat.main(EmbeddedTomcat.java:
          102)
          Caused by: org.quartz.SchedulerConfigException: Failure occured during job recovery. 
          [See nested exception: org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: DB2 SQL error: SQLCODE: -204, SQLSTATE: 42704, SQLERRMC: DB2ADMIN.QRTZ_LOCKS [See nested exception: com.ibm.db2.jcc.b.SqlException: DB2 SQL error: SQLCODE: -204, SQLSTATE: 42704, SQLERRMC: DB2ADMIN.QRTZ_LOCKS]]
              at org.quartz.impl.jdbcjobstore.JobStoreSupport.initialize(JobStoreSupport.java:
          557)
              at org.quartz.impl.jdbcjobstore.JobStoreCMT.initialize(JobStoreCMT.java:
          144)
              at org.springframework.scheduling.quartz.LocalDataSourceJobStore.initialize(LocalDataSourceJobStore.java:
          133)
              at org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:
          1204)
              at org.quartz.impl.StdSchedulerFactory.getScheduler(StdSchedulerFactory.java:
          1355)
              at org.springframework.scheduling.quartz.SchedulerFactoryBean.createScheduler(SchedulerFactoryBean.java:
          687)
              at org.springframework.scheduling.quartz.SchedulerFactoryBean.afterPropertiesSet(SchedulerFactoryBean.java:
          582)
              at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:
          1390)
              at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:
          1359)
               
          23 more
          Caused by: org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: DB2 SQL error: SQLCODE: -
          204, SQLSTATE: 42704, SQLERRMC: DB2ADMIN.QRTZ_LOCKS [See nested exception: com.ibm.db2.jcc.b.SqlException: DB2 SQL error: SQLCODE: -204, SQLSTATE: 42704, SQLERRMC: DB2ADMIN.QRTZ_LOCKS]
              at org.quartz.impl.jdbcjobstore.StdRowLockSemaphore.executeSQL(StdRowLockSemaphore.java:
          112)
              at org.quartz.impl.jdbcjobstore.DBSemaphore.obtainLock(DBSemaphore.java:
          112)
              at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:
          3655)
              at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:
          3624)
              at org.quartz.impl.jdbcjobstore.JobStoreSupport.cleanVolatileTriggerAndJobs(JobStoreSupport.java:
          693)
              at org.quartz.impl.jdbcjobstore.JobStoreSupport.initialize(JobStoreSupport.java:
          555)
               
          31 more
          Caused by: com.ibm.db2.jcc.b.SqlException: DB2 SQL error: SQLCODE: -
          204, SQLSTATE: 42704, SQLERRMC: DB2ADMIN.QRTZ_LOCKS
              at com.ibm.db2.jcc.b.fg.e(fg.java:
          1596)
              at com.ibm.db2.jcc.b.fg.a(fg.java:
          1206)
              at com.ibm.db2.jcc.a.gb.g(gb.java:
          140)
              at com.ibm.db2.jcc.a.gb.a(gb.java:
          39)
              at com.ibm.db2.jcc.a.w.a(w.java:
          34)
              at com.ibm.db2.jcc.a.vb.g(vb.java:
          139)
              at com.ibm.db2.jcc.b.fg.n(fg.java:
          1177)
              at com.ibm.db2.jcc.b.gg.eb(gg.java:
          1862)
              at com.ibm.db2.jcc.b.gg.d(gg.java:
          2295)
              at com.ibm.db2.jcc.b.gg.V(gg.java:
          424)
              at com.ibm.db2.jcc.b.gg.executeQuery(gg.java:
          407)
              at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:
          92)
              at org.quartz.impl.jdbcjobstore.StdRowLockSemaphore.executeSQL(StdRowLockSemaphore.java:
          92)
               
          36 more


          以上就是結(jié)合Spring使用Quartz編寫定時(shí)任務(wù)兩種方式,Spring很好的封裝使用Quartz的細(xì)節(jié),第一種方式是利用SPring封裝的Quartz類進(jìn)行特定方法的實(shí)現(xiàn),第二種是通過(guò)透明的使用Quartz達(dá)到定時(shí)任務(wù)開(kāi)發(fā)的目的,總體說(shuō)第二種對(duì)開(kāi)發(fā)人員更方便!
          posted on 2008-01-09 13:03 harry520 閱讀(15909) 評(píng)論(6)  編輯  收藏 所屬分類: J2EE

          評(píng)論

          # re: 實(shí)踐Quartz定時(shí)任務(wù)方式大全 2008-01-10 16:03 zengzp
          需要每個(gè)30秒對(duì)系統(tǒng)指定目錄進(jìn)行掃描,把符合條件的文件進(jìn)行解析入庫(kù)工作,對(duì)使用Quartz來(lái)定時(shí),是否能判斷文件是否寫入完成?怎判斷?  回復(fù)  更多評(píng)論
            

          # re: 實(shí)踐Quartz定時(shí)任務(wù)方式大全[未登錄](méi) 2008-01-10 16:28 harry520
          我這方面業(yè)務(wù)沒(méi)有講清,我這邊自動(dòng)寫入完成之后會(huì)把文件備份后刪掉;如果解析入庫(kù)有問(wèn)題,備份到失敗的目錄中,然后刪掉并把信息寫入日志,我們有個(gè)日志處理系統(tǒng)會(huì)在那里對(duì)產(chǎn)生信息進(jìn)行處理  回復(fù)  更多評(píng)論
            

          # re: 實(shí)踐Quartz定時(shí)任務(wù)方式大全 2008-01-16 20:07 王能
          我這個(gè)網(wǎng)站http://www.yaonba.com 也是這樣做的哦.   回復(fù)  更多評(píng)論
            

          # re: 實(shí)踐Quartz定時(shí)任務(wù)方式大全 2008-10-21 23:24 biiau
          我沒(méi)有設(shè)置default-lazy-init="true"這些東西,我還是報(bào)那樣的錯(cuò)誤是怎么回事呢?  回復(fù)  更多評(píng)論
            

          # re: 實(shí)踐Quartz定時(shí)任務(wù)方式大全 2013-05-31 14:15 hanmiao
          文章中不少錯(cuò)別字,是不是樓主從什么地方抄過(guò)來(lái)之后,都沒(méi)看壹眼就發(fā)表出來(lái)了。  回復(fù)  更多評(píng)論
            

          # re: 實(shí)踐Quartz定時(shí)任務(wù)方式大全 2014-10-14 10:13 蕭紫飛飛
          幫大忙了,還是對(duì)spring的bean注入沒(méi)有深入理解  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 长沙市| 云南省| 山丹县| 本溪| 霍州市| 天气| 铁岭市| 西宁市| 达拉特旗| 潮安县| 宝鸡市| 龙井市| 南漳县| 乳山市| 石首市| 许昌县| 杨浦区| 定南县| 建阳市| 云龙县| 咸丰县| 长岛县| 新绛县| 朝阳区| 惠来县| 富裕县| 区。| 阳西县| 巴东县| 台南市| 新密市| 西乌珠穆沁旗| 临江市| 滁州市| 长武县| 元朗区| 房产| 黑山县| 喀喇沁旗| 化州市| 华容县|