博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
quartz + spring定时任务调度
阅读量:5934 次
发布时间:2019-06-19

本文共 4724 字,大约阅读时间需要 15 分钟。

hot3.png

最近要用到squartz来配置定时任务调度,网上搜了许多资料,也查了许多实例代码,大抵基本的调度代码都如下所示:

如下代码转自:http://blog.csdn.net/sambino/article/details/3934670,sambino的专栏。

 1. javabean类

                  在Test.QuartzJob中

           package Test;

           public class QuartzJob {

              public void work()
              {
                    System.out.println("Quartz的任务调度!!!");
                 }
            }

      2. 设置Spring的xml

            我新建了一个applicationContext_quartz.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<beans
xmlns=""
xmlns:xsi=""
xmlns:jee=""
xsi:schemaLocation="
">

        <!-- 要调用的工作类 -->
        <bean id="quartzJob" class="Test.QuartzJob"></bean>
        <!-- 定义调用对象和调用对象的方法 -->
        <bean id="jobtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
            <!-- 调用的类 -->
            <property name="targetObject">
                <ref bean="quartzJob"/>
            </property>
            <!-- 调用类中的方法 -->
            <property name="targetMethod">
                <value>work</value>
            </property>
        </bean>
        <!-- 定义触发时间 -->
        <bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerBean">
            <property name="jobDetail">
                <ref bean="jobtask"/>
            </property>
            <!-- cron表达式 -->
            <property name="cronExpression">
                <!-- 每隔10秒执行一次-->
                <value>0/10 * * * * ?</value>
            </property>
        </bean>
        <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
        <bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            <property name="triggers">
                <list>
                    <ref bean="doTime"/>
                </list>
            </property>
        </bean>
  
</beans>

       3. 设置web.xml对Spring加载

<!-- 加载spring -->

<context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>
    /WEB-INF/classes/applicationContext*.xml
   </param-value>
</context-param>
<servlet>
   <servlet-name>context</servlet-name>
   <servlet-class>
    org.springframework.web.context.ContextLoaderServlet
   </servlet-class>
   <load-on-startup>1</load-on-startup>
</servlet>

注意:1.导入quartz-all-1.5.2.jar  下载

           2.导入spring.jar(我用的是spring2.0以前的版本)  下载
              如果不导入的话
               org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
              org.springframework.scheduling.quartz.CronTriggerBean
              org.springframework.scheduling.quartz.SchedulerFactoryBean
              spring中的这三个类找不到,spring不能正常加载,由于第一次使用Quartz,我就是当时忽略了这一点,浪费了很多时间来调配置,其实配置一点没有错误。
            3. 你会问为什么用spring后就不用
                quartz.properties
                quartz-jobsxml   
                这两个文件了么?
                我回答:是的,它会自动找到quartz包中默认的这两个文件,如果你有特殊需要,也可以自己定义这两个文件。

附:quartz.properties

#
# Configure Main Scheduler Properties
#

org.quartz.scheduler.instanceName = TestScheduler

org.quartz.scheduler.instanceId = one

#

# Configure ThreadPool
#

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool

org.quartz.threadPool.threadCount = 5
org.quartz.threadPool.threadPriority = 4

#

# Configure JobStore
#

#org.quartz.jobStore.misfireThreshold = 5000

#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

# ===========================================================================

# Configure SchedulerPlugins ===============================================
# ===========================================================================
#org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingTriggerHistoryPlugin
#org.quartz.plugin.triggHistory.triggerFiredMessage = Trigger {1}.{0} fired job {6}.{5} at: {4, date, HH:mm:ss MM/dd/yyyy}
#org.quartz.plugin.triggHistory.triggerCompleteMessage = Trigger {1}.{0} completed firing job {6}.{5} at {4, date, HH:mm:ss MM/dd/yyyy} with resulting trigger instruction code: {9}

org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin

org.quartz.plugin.jobInitializer.fileName =quartz_jobs.xml
org.quartz.plugin.jobInitializer.overWriteExistingJobs = false
org.quartz.plugin.jobInitializer.failOnFileNotFound = true

org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin

org.quartz.plugin.shutdownhook.cleanShutdown = true

系统会根据配置文件找到quartz_jobs.xml

     配置之后,发现总是报错:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.scheduling.quartz.SchedulerFactoryBean#0' defined in ServletContext resource [/WEB-INF/spring/applicationContext-others.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: Table 'lbassnew.qrtz_locks' doesn't exist [See nested exception: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Table 'lbassnew.qrtz_locks' doesn't exist]]

    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1420)

浏览了一翻配置文件,发现项目原先已经有相关的quartz配置代码,于是将自己配置的SchedulerFactoryBean去掉,直接将配置的调度器放入已有的SchedulerFactoryBean中,启动,无错。

其次,在配置调度时间的时候,如果配置的启动时间为:0 50-55 16 * * ?那么,即时配置的 <property name="concurrent" value="true"/> ,启动之后也需要等待到配置的时间才会启动任务。特此记录。

转载于:https://my.oschina.net/u/232879/blog/51553

你可能感兴趣的文章
Mybatis 常用的几个对象
查看>>
参加微软 MVP 之夜暨微软技术与生态大会
查看>>
屌丝气质难掩,逼人逃离么?
查看>>
OFBiz + Opentaps 目录管理 四. 产品(一)定义产品
查看>>
list泛型类型获取
查看>>
VIM一些用法
查看>>
Nginx 502错误原因与解决办法
查看>>
使用Django来处理对于静态文件的请求
查看>>
dom4j解析xml的简单实用
查看>>
批量进行One-hot-encoder且进行特征字段拼接,并完成模型训练demo
查看>>
MySQL数据库在Windows环境下安装配置
查看>>
由浅入深学习Apache httpd原理与配置
查看>>
用tiny project来激励自己入门
查看>>
制作同时支持armv7,armv7s,arm64,i386,x86_64的静态库.a
查看>>
Beyond Compare的几种实用功能
查看>>
旧工程适配iOS 6和iPhone 5的一些故事
查看>>
CentOS版本怎么安装python的pip及mycli的安装
查看>>
was安装
查看>>
Android Studio 使用艺术
查看>>
Android架构:第四部分-在Android上应用Clean架构,实践(包含源代码)(译)
查看>>