精华内容
下载资源
问答
  • quartz定时任务执行

    千次阅读 2020-02-26 13:54:27
    quartz定时任务执行一段时间不执行的原因 数据库表QRTZ_TRIGGERS 里的TRIGGER_STATE 字段的值自动修改为ERROR了 ,quartz定时任务是不扫描这种ERROR情况. 之所以出现ERROR 原因在于job里有bug,导致quartz自动将状态...

    quartz定时任务执行一段时间不执行的原因

    数据库表QRTZ_TRIGGERS 里的TRIGGER_STATE 字段的值自动修改为ERROR了 ,quartz定时任务是不扫描这种ERROR情况.

    之所以出现ERROR 原因在于job里有bug,导致quartz自动将状态改变,然后quartz不执行ERROR状态的job.

    1.查找原因

    原因如下图:( 查找原因的方法是 将ERROR改为正常状态时,会打印错误 )

    TRIGGER_STATE的状态有:

    WAITING:等待 
    
    PAUSED:暂停 
    
    ACQUIRED:正常执行 
    
    BLOCKED:阻塞 
    
    ERROR:错误
    

    在这里插入图片描述

    2.数据库的现象

    如下图:

    在这里插入图片描述

    其中TRIGGER_STATE 状态的字段为ERROR ,可以将其改为上面的WAITING:等待或者ACQUIRED:正常执行 然后重启项目,这时在控制台可能会有一图所示类似的错误日志.

    3.TRIGGER_STATE 字段改变后不会自动改正,并且quartz定时任务不扫描ERROR 状态

    因此,quartz定时任务可能执行几次后遇到job里的bug就自动修改了状态,那么这个quartz定时任务就不再执行了.

    4.解决方案

    解决quartz定时任务job里的bug,然后将数据库QRTZ_TRIGGERS 里的TRIGGER_STATE 字段的状态修改为正常的状态.

    5.完美解决此类问题

    小伙伴们,如果你们有更好的解决方案,请给我留言哦.

    展开全文
  • quartz 动态定时任务 根据数据库数据配置动态定时任务
  • Quartz.net作业调度自定义定时执行任务多任务执行c#,定时执行任务,如超时取消订单,自动确认收货等等
  • spring quartz 部分定时任务执行问题定位修复方案

    千次阅读 多人点赞 2021-01-19 09:05:32
    2021年1月7号上线迁移需求之后,出现最为明显的 众帮文件上传 其他部分定时任务也不执行的情况 执行时间并没有按照约定时间去执行 分析1 怀疑是代码问题? 对众帮文件上传定时任务代码进行排查 并无发现编码问题,...

    Quartz部分定时任务不执行问题分析过程及修复方案

    背景:
    2021年1月7号上线迁移需求之后,出现最为明显的 众帮文件上传 其他部分定时任务也不执行的情况 执行时间并没有按照约定时间去执行

    分析1 怀疑是代码问题?

     对众帮文件上传定时任务代码进行排查 并无发现编码问题,并且对1月7号上的版本 和上一个版本进行代码比对 并未发现对众邦的代码有所改动的地方
    

    分析2 项目定时任务框架 spring quartz 内部任务存储 调度问题?

      Quartz 是基于RAMJobStore调度中心去调度的,里面有Job(任务),Trigger(触发器)。
    
      通过对项目定时任务代码的了解 及源码的分析 得知:
    

    项目启动时 会把applicationContext-quartz.xml配置文件中的所有定时任务加载到jobDefinitions 这个队列中,遍历jobDefinitions 把每个定时任务的 job 和 Trigger获取到,通过Quartz API 把定时任务添加到RAMJobStore, 经过对jobDetail的校验 ,这里主要是校验name,group,jobClass 是否为空,然后jobDetail的下次触发时间是否合法 然后添加到RAMJobStore(JobWrapper, TriggerWrapper)中。
    秉着这一逻辑思想
    1月14号上线 项目重启后 拉取项目 堆栈包heap1.hprof
    使用jprofiler分析工具 打开heap1.hprof
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    如图 找到RAMJobStore中的两个存储对象 发现job 和 trigger中存储的数量是一致的,于是我打算点对点的排查 由于生产最为明显的是众帮文件上传定时任务不执行 所以我从这76任务中,找到众帮文件上传的wrapper 看看是不是有什么问题。在这里插入图片描述
    如图可以看出 众帮文件上传的定时任务 从开始执行时间,下次触发时间,是否有配套的监听器 都是正常的 ,可就是不执行,于是我开始quartz调度的过程,如何调度的执行的。
    几经翻查 发现quertz 定时任务在调度时,都需要初始化一个线程池SimpleThreadPool 而这个线程池大小默认是10,而quertz任务触发调度的原则是:
    1、线程池资源获取等待定时任务过期作废机制。
    2、Quartz框架的定时任务执行是绝对时间触发的,所以存在“过期不候”的现象。

    所以开始怀疑是项目定时任务过多87个 并且大部分定时任务都是 10秒 ,20秒,30秒 1分钟执行一次 过于密集

    分析3 quartz 调度初始化没有问题 定时任务多,且时间密集导致?

    为了复现和生产一样的情况 众帮及其他部分定时任务不执行的情况,由于测试环境基本没有数据,所以每个定时任务执行的非常快,所以不存在生产的情况,所以我把代码中每个定时任务 让他们执行时,都线程等待60秒,并且做了一个定时任务计数器。
    “fpcCallBack”:205,
    “alipayPromoteDataAndRule”:1657,
    “bdTransactionCallBack”:680,
    “networkVerifyDataAndRule”:5,
    “processDataAndRule”:976,
    “paphLoanDataAndRule”:203,
    “fplCallBack”:124,
    “jdDataAndRule”:828,
    “paphDataAndRule”:312,
    “callBack”:511,
    “fpShareLoanPeople”:1260,
    “fpcDataAndRule”:1282,
    “wsdMigrateCreditAckDate”:9,
    “zhongbangFileUp2View”:“1”,
    “sendTxnJob”:“1”,
    “AliPayBigTextAnalysis”:393,
    “pplDataAndRule”:33,
    “sendTxnBdCreditMigrate”:18,
    “blackList”:46,
    “sendTxnJDLoan”:15,
    “creditCallBack”:1312,
    “fileSyncDataAndRule”:1529,
    “ppcDataAndRule”:127,
    “jLFSCallBack”:62,
    “qlLoanDataAndRule”:2,
    “OpenAccountNetCheck”:54,
    “zbCallBack”:3,
    “yjSendTxnLoan”:5,
    “gjjCallBack”:101,
    “ppdDataAndRule”:82,
    “alipayDataAndRule”:1687,
    “jfDataAndRule”:506,
    “jfCallBack”:17,
    “qlLoanCallBack”:2,
    “bdCreditDataAndRule”:4966,
    “alipayHBDataAndRule”:1673,
    “fileSyncCallBack”:3123,
    “youXLoanDataAndRule”:6,
    “pplCallBack”:4,
    “bdCreditCallBack”:794,
    “wsdConfirmDataAndRule”:12,
    “bdAdjustLimitMigrate”:3045,
    “sendSoapJob”:1102,
    “OdMonitor”:1321,
    “estDateSourceMonitor”:25,
    “qianLLCallBack”:4,
    “yxCallBack”:“1”,
    “jLFSDataAndRule”:605,
    “zbDataAndRule”:2,
    “cxcDataAndRule”:535,
    “bdTransactionDataAndRule”:3224,
    “bdAdjustmentCallBack”:1020,
    “fileUpload”:678,
    “bdCreditMigrate”:2043,
    “yxLoanDataAndRule”:6,
    “sendTxnLoan”:11,
    “ppcCallBack”:9,
    “wsdDataAndRule”:10,
    “dfCallBack”:477,
    “cxlDataAndRule”:475,
    “gjjDataAndRule”:725,
    “qianLLoanDataAndRule”:519,
    “qlCallBack”:“1”,
    “fileDownloadAndUpBD”:386,
    “tszCallBack”:“1”,
    “tszDataAndRule”:“1”,
    “yxDataAndRule”:6,
    “bdAdjustmentDataAndRule”:6760,
    “yjDataAndRule”:8,
    “jdCallBack”:1153,
    “bdTransactionMigrate”:1913,
    “wsdMigrateCreditDate”:9,
    “yjFileSyncDataAndRule”:8,
    “fplDataAndRule”:1308

    从计数器打印结果可以看出
    在测试环境执行了15小时左右 果然出现了和生产一样的情况
    一共87个定时任务 执行了73个有19个未执行 已执行的存在执行次数为个位数的情况

    所以我认定quartz定时任务执行存在线程瓶颈 与此我发现为什么众帮的文件上传一次执行的机会都不能抢到吗?想必小伙伴们也会有这种猜疑 就算触发时间相同情况下 可触发的数量有限 难道众邦一次都抢不到执行线程吗?

    于是 又一顿的百度 博客 终于找到了对应的解释
    默认情况是触发时间先后顺序排列,触发时间比较前的先执行任务,但如果一个或多个任务同时在相同时间触发下,触发器设置优先级越高越先执行。如果优先级相同,则跟任务的存储方式有关,RAMJobStore时与TriggerKey排序有关,即按触发器名的字母序;如果是JdbcStore则跟数据库查询的默认排序有关了。Trigger优先级默认为5,数值越大优先级越高

    这会大家应该明白了吧 众邦的定时任务名称叫做 zhongbangFileUp2ViewJob 所以 在相同触发条件下 并且执行数量有限的情况下,他被淘汰了

    **

    问题解决:

    那么此时留下的问题就是 解决 quartz执行线程数量太少10个的问题
    我们要做的就是 增加quartz 执行线程数量
    由于本项目 quartz 的框架版本过低1.5.2 无法通过quartz.properties
    进行声明线程数量 这里我就不想吐槽了 试了很多种办法不行 ,而且版本调整到2.0.0以上后 OPS 封装的quarzt代码全部报错 版本完全不兼容。
    于是我们在applicationContext-quartz.xml中
    在这里插入图片描述
    在SchedulerFactoryBean中对quartz.properties进行复写 并且改变线程数量为100,以及Trigger检查器 默认每次只Acquire一个Trigger。

    丢到测试环境测试 定时任务计数器打印结果如下:
    “bdCreditDataAndRule”:128,
    “fpShareLoanPeople”:14,
    “gjjCallBack”:14,
    “youXLoanDataAndRule”:16,
    “jdCallBack”:15,
    “jfCallBack”:31,
    “bdAdjustLimitMigrate”:30,
    “sendTxnJDLoan”:32,
    “pplDataAndRule”:15,
    “estDateSourceMonitor”:“1”,
    “fplDataAndRule”:11,
    “wsdMigrateCreditDate”:9,
    “creditCallBack”:7,
    “paphDataAndRule”:10,
    “tszDataAndRule”:12,
    “ppdDataAndRule”:51,
    “wsdMigrateCreditAckDate”:19,
    “dfCallBack”:10,
    “yxLoanDataAndRule”:43,
    “zhongbangFileUp2View”:2,
    “qianLLoanDataAndRule”:11,
    “fpcDataAndRule”:12,
    “callBack”:9,
    “paphLoanDataAndRule”:11,
    “pplCallBack”:11,
    “blackList”:2,
    “yjSendTxnLoan”:39,
    “ppcDataAndRule”:20,
    “cxlDataAndRule”:10,
    “yxLoanCallBack”:14,
    “gjjDataAndRule”:23,
    “processDataAndRule”:19,
    “sendTxnLoan”:37,
    “ppcCallBack”:15,
    “alipayPromoteDataAndRule”:8,
    “qlLoanCallBack”:8,
    “qlCallBack”:6,
    “bdTransactionDataAndRule”:129,
    “qlDataAndRule”:8,
    “fileSyncCallBack”:156,
    “plagueMonitor”:2,
    “yjFileSyncDataAndRule”:49,
    “fplCallBack”:10,
    “bdAdjustmentCallBack”:19,
    “bdAdjustmentDataAndRule”:149,
    “sendTxnBdCreditMigrate”:39,
    “bdCreditCallBack”:14,“fpcCallBack”:9,
    “bdTransactionMigrate”:35,
    “yjDataAndRule”:39,
    “cxcDataAndRule”:14,
    “bdTransactionCallBack”:24,
    “sendSoapJob”:22,
    “fileDownloadAndUpBD”:24,
    “alipayDataAndRule”:8,
    “OpenAccountNetCheck”:3,
    “fileUpload”:7,
    “AliPayBigTextAnalysis”:11,
    “qlLoanDataAndRule”:14,
    “jfDataAndRule”:10,
    “qianLLCallBack”:24,
    “bdCreditMigrate”:35,
    “alipayHBDataAndRule”:13,
    “wsdDataAndRule”:38,
    “jdDataAndRule”:15,
    “yxDataAndRule”:8,
    “sendTxnJob”:19,
    “wsdConfirmDataAndRule”:37,
    “yxCallBack”:10,
    “OdMonitor”:14,
    “fileSyncDataAndRule”:36,
    “zbCallBack”:15,
    “tszCallBack”:11,
    jLFSDataAndRule":13,
    “jLFSCallBack”:9,
    “zbDataAndRule”:39

    从结果中可以看出 每次定时任务都执行了,并且执行的次数都比较均匀,不像一开始 有的执行几千次,有的执行几十次,受线程执行数 已经定时任务首字木影响较大。 而且从结果中可以看出 众帮的数据处理执行了39次 众邦的文件上传 每10分钟执行一次 每次轮到执行的执行时,都执行了,不存在拿不到执行线程的情况

    quartz定时任务使用结论

    1、线程池资源获取等待定时任务过期作废机制。
    2、Quartz框架的定时任务执行是绝对时间触发的,所以存在“过期不候”的现象。
    3、在使用Quartzs框架时,一定要预先计算好triggers数量与线程池大小的匹配程度,资源一定要够,或者任务执行密度不能太大,否则等到线程任务释放完,trigger早已过期,就无法按预期时间触发了。
    4、在进行业务代码开发过程中 尽量一个定时任务中处理多种业务代码,做异步线程处理,对定时任务进行归类 抽取
    5.根据业务情况 不要一上来就增加定时任务,靠定时任务处理问题

    展开全文
  • 1.简单的一个定时任务Demo,可直接在eclipse中运行。 2.注释全面,简单易懂 3.比较全面,如果当前定时任务没有执行完,则下一个也不能执行
  • quartz 定时任务

    2017-09-20 10:40:06
    <context:component-scan base-package="cn.ly.quartz.service" /> <!-- job --> class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <property name="jobClass" value="cn.ly....
  • Spring + quartz 定时任务修改定时时间不重启服务
  • 写了一个spring+quartz定时任务,但是发现服务启动后并没有马上执行。网上也没找到能解决的办法,只能自己慢慢试。此文章是自己作为笔记用的,仅供参考。本人菜鸟,文中很多用词可能不当,勿喷。

    写了一个spring+quartz的定时任务,但是发现tomcat正常启动后并没有马上执行。网上也没找到能解决的办法,只能自己慢慢试。此文章是自己作为笔记用的,仅供参考。本人菜鸟,文中很多用词可能不当,勿喷。

    spring+quartz定时任务网上有很多资料可以参考,我这里就不多说了,直接贴上我的代码。

    1.项目结构


    2.pom.xml添加包

    <!-- 定时任务 -->
    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>2.3.0</version>
    </dependency>

    3.spring-quartz.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!-- 启动触发器的配置开始 -->
        <!--lazy-init="false" 表示不需要延迟加载,容器启动就会执行-->
        <bean id="quartzsScheduler" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            <property name="triggers">
                <list>
                    <ref bean="imageTrigger" />
                </list>
            </property>
        </bean>
        <!-- 触发器 quartz的配置 -->
        <bean id="imageTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
            <property name="jobDetail" ref="testJobDetail" />
            <!-- 每天8点到22点,每半小时触发一次 -->
            <property name="cronExpression" value="0 0/30 8-22 * * ?" />
        </bean>
        <!-- job的配置开始 -->
        <bean id="testJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
            <!-- 调用的类  -->
            <property name="targetObject" ref="orderImageService" />
            <!-- 调用类中的方法  -->
            <property name="targetMethod" value="queryOrderImageFromOCR" />
        </bean>
    </beans>

    4.修改之前的spring-mvc.xml

    <!-- 定时任务管理 -->
    <import resource="classpath:/spring/spring-quartz.xml"/>
    
    <!-- bean管理 -->
    <import resource="classpath:/spring/spring-bean.xml"/>
    	
    	
    

    5.web.xml

    <servlet>
        <servlet-name>microManager</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                    classpath*:spring/spring-mvc.xml
            </param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>microManager</servlet-name>
        <!-- 所有的的请求,都会被DispatcherServlet处理 -->
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    <listener>
       <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    定时任务具体执行的方法就不写了,根据自己的需求来。

    按照上述的配置,在正常启动tomcat后,并没有马上执行配置的定时任务,必须要项目里有方法被调用后才会执行。

    查了很久资料,发现web.xml中必须直接加载配置定时任务的xml文件,而我写的是web.xml直接加载spring-mvc.xml,然后在spring-mvc.xml中引入spring-quartz.xml。

    于是,我在web.xml中添加了

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:spring/spring-quartz.xml</param-value>
    </context-param>

    然后重启服务,这次定时任务马上执行了。

    可是又出现了新的问题:项目中用的mybatis,定时任务执行的方法中也有对数据库的操作,而数据库的配置配置配置,注解的配置都是在spring-mvc.xml中的,在调用对数据库操作的方法(orderRecordMapper.selectByState(state))时报错,原因是orderRecordMapper为null。

    这就意味着当我的web.xml中的内容为

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:spring/spring-quartz.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>microManager</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                    classpath*:spring/spring-mvc.xml
            </param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>microManager</servlet-name>
        <!-- 所有的的请求,都会被DispatcherServlet处理 -->
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

    时,spring-quartz.xml是加载了,但是spring-mvc.xml中的内容好像就失效了,至少是不能共用的,具体原因还不太清楚,对这块的知识太欠缺了,但是并不影响我解决问题。

    于是我又修改了web.xml文件为

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
    		classpath*:spring/spring-quartz.xml
    		classpath*:spring/spring-mvc.xml
        </param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>microManager</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>microManager</servlet-name>
        <!-- 所有的的请求,都会被DispatcherServlet处理 -->
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

    OK了,tomcat重新启动后,定时任务马上执行,而且执行的方法也没有问题。

    你以为就这样结束了么,那你就错了。

    我既然改动了<servlet-mapping>中的内容,那么会不会对我的http接口有影响呢,果然,测试发现原来能正常调用的接口,现在调用报错,说找不到microManager-servlet.xml。WTF什么鬼,项目里根本没有这个xml,不过有microManager,那么肯定就是由于改动了<servlet-mapping>中的内容导致的。

    好吧,我再次改动web.xml,所幸,这次改动后一切都正常,终于搞定了。中间的过程省略了很多,因为自己只是的羸弱,只能靠摸索,反正花了很长时间。

    web.xml终极版:

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
                    classpath*:spring/spring-quartz.xml
                    classpath*:spring/spring-mvc.xml
        </param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>microManager</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:spring/spring-mvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>microManager</servlet-name>
        <!-- 所有的的请求,都会被DispatcherServlet处理 -->
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

    这个问题总算告一段落,可解决这个问题的过程中又出现很多新的问号:

    1.web.xml中param-name为contextConfigLocation的地方有两处,为何没有影响?如果把contextConfigLocation换成其他自定义的名字会不会有影响?

    2.web.xml中context-param表示什么意思?

    3.web.xml中不直接加载定时任务的spring-quartz.xml的情况下启动服务为何不马上执行?

    4.web.xml中配置了spring-quartz.xml,为何对于mapper的注解失效?

    这些问题还需要后续去弄明白,大家也可以和我一起探究(ps:大神就不用了哈)。

    第一次分享,很多地方写的有问题,欢迎大家批评指教哈,有不清楚的地方也可以指出来的,我会一一解答,如果我也不清楚就没得办法了。哈哈。




    展开全文
  • 应用quartz实现了多任务并发执行,定时时间从数据库获取,并且能够在更改数据库执行时间后重新执行定时任务,实现了quartz定时任务的动态管理。本次为了实现功能,代码并未作优化,仅作参考借鉴之用。
  • 新手, 如题,我配置完成了spring+Quartz,但是单元测试的时候只执行了一遍就退出了,请问是为什么? ![图片说明](https://img-ask.csdn.net/upload/201810/23/1540274512_264535.png) ![图片说明]...
  • Quartz定时任务常用的11张数据库脚本表结构,网上大部分都是只是说说,没有实际帮助,有的大部分积分还很贵,本人总结一下,希望能给有需要的人一些帮助。
  • Quartz是一个定时任务框架,其他介绍网上也很详尽。这里要介绍一下Quartz里的几个非常核心的接口。通过实例代码给大家讲解SpringBoot集成Quartz实现定时任务的方法,感兴趣的朋友一起看看吧
  • 下面小编就为大家带来一篇quartz定时执行任务,并配置web.xml的操作方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • quartz定时任务执行不报错处理

    万次阅读 2019-03-26 21:15:51
    用开源定时任务框架Quartz搭建定时任务,任务启动后无任何错误信息输出,也不执行任务。 quartz版本 <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</...

    用开源定时任务框架Quartz搭建定时任务,任务启动后无任何错误信息输出,也不执行任务。

    quartz版本

            <dependency>
                <groupId>org.quartz-scheduler</groupId>
                <artifactId>quartz</artifactId>
                <version>2.3.0</version>
            </dependency>

    quartz schedule 调度器核心代码

    /**
     * 定时任务调度器
     */
    public class QuartzSchedule {
    
        private static Logger logger = LoggerFactory.getLogger(QuartzSchedule.class);
    
        private static Scheduler scheduler;
    
        static {
            try {
                scheduler = StdSchedulerFactory.getDefaultScheduler();
                initTimer();
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
        }
    
        public QuartzSchedule() throws SchedulerException {
        }
    
        /**
         * 初始化定时任务
         *
         * @throws SchedulerException
         */
        private static void initTimer() {
            // and start it off
            try {
                JobDetail jobDetail = new JobDetailImpl();
                //定时任务名称,指定属于哪一个定时任务
                JobKey jobKey = new JobKey("Job1");
                ((JobDetailImpl) jobDetail).setKey(jobKey);
                ((JobDetailImpl) jobDetail).setJobClass(QuartzTask.class);
    
                JobDataMap jobDataMap = new JobDataMap();
                IQuartzTaskProcess process = new QuartzTaskProcess();
                jobDataMap.put("attachment", process);
                jobDataMap.put("className", "com.job.TestJob1");
                jobDataMap.put("methodName", "doTask");
                ((JobDetailImpl) jobDetail).setJobDataMap(jobDataMap);
                //任务触发器
                Trigger trigger = new CronTriggerImpl();
                ((CronTriggerImpl) trigger).setCronExpression("*/5 * * * * ?");
                ((CronTriggerImpl) trigger).setName("trigger");
                ((CronTriggerImpl) trigger).setJobKey(jobKey);
    
                scheduler.scheduleJob(jobDetail, trigger);
            } catch (ParseException e) {
                e.printStackTrace();
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
        }
    
        //定时任务主调
        public static void start() throws Exception {
            if (ZkUtils.lock("/timer")) {
                boolean started = scheduler.isStarted();
                if (!started) {
                    System.out.println("start job ");
                    try {
                        scheduler.start();
                    } catch (SchedulerException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        public static void pauseJob(JobKey jobKey) throws SchedulerException {
            System.out.println("pauseJob jobName : " + jobKey.getName());
            scheduler.pauseJob(jobKey);
        }
    
        public static void resumeJob(JobKey jobKey) throws SchedulerException {
            System.out.println("resumeJob jobName : " + jobKey.getName());
            scheduler.resumeJob(jobKey);
        }
    
        public static void removeJob(JobKey jobKey) throws SchedulerException {
            scheduler.deleteJob(jobKey);
        }
    }
    QuartzTask类如下
    public class QuartzTask implements Job {
    
        private IQuartzTaskProcess quartzTaskProcess;
    
        public QuartzTask(IQuartzTaskProcess process) {
            this.quartzTaskProcess = process;
        }
        public void execute(JobExecutionContext context)  {
            try {
                //执行业务逻辑
                //可以通过context将调用方法的类信息传递过来,通过反射调用任务
                IQuartzTaskProcess quartzTaskProcess = (IQuartzTaskProcess) context.getJobDetail().getJobDataMap().get("attachment");
                IQuartzJobParam param = new QuartzJobParam();
                JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
                ((QuartzJobParam) param).setClassName(jobDataMap.getString("className"));
                ((QuartzJobParam) param).setMethodName(jobDataMap.getString("methodName"));
                quartzTaskProcess.processJob(param);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    启动测试

        @Test
        public void testSchedule() throws Exception {
            QuartzSchedule.start();
            System.in.read();
        }

    运行情况如下

    发现定时任务启动了,但是未执行task任务,断点跟踪源码发现报错了,但是没有错误日志输出,有可能由于没有日志的配置文件导致quartz框架日志没有输出,于是在config下log4j.properties文件,内容如下

    log4j.rootLogger=INFO, stdout
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
    log4j.appender.logfile=org.apache.log4j.FileAppender
    log4j.appender.logfile.File=target/spring.log
    log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
    log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n 
    

    继续执行,如下

    有错误日志了,是SimpleJobFatory的newJob出现异常,跟踪源码

        public Job newJob(TriggerFiredBundle bundle, Scheduler Scheduler) throws SchedulerException {
            JobDetail jobDetail = bundle.getJobDetail();
            Class jobClass = jobDetail.getJobClass();
    
            try {
                if (this.log.isDebugEnabled()) {
                    this.log.debug("Producing instance of Job '" + jobDetail.getKey() + "', class=" + jobClass.getName());
                }
    
                return (Job)jobClass.newInstance();
            } catch (Exception var7) {
                SchedulerException se = new SchedulerException("Problem instantiating class '" + jobDetail.getJobClass().getName() + "'", var7);
                throw se;
            }
        }

    发现是jobClass.newInstance()出现异常,返回去检查我们写的QuartzTask类,果然有问题,修改继续测试

    任务正常执行。。。

    展开全文
  • 通过数据库配置要执行的类及方法,设定相应时间,定时执行任务
  • java quartz 定时任务

    2018-06-01 13:54:34
    使用quartz实现的java 定时任务,通过写cron表达式,让任务在制定时刻触发执行
  • NULL 博文链接:https://medbricom.iteye.com/blog/1782765
  • 近日项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息,借此机会整理了一下定时任务的几种实现方式,由于项目采用spring框架,所以我都将结合spring框架来介绍
  • springmvc中实现quartz定时任务(每分钟的第3秒执行任务调度方法)文章支持jar包
  • 基于springmvc+mybatius+quartz实现的web管理的持久化定时任务。使用了JDBC和插件方式实现任务的添加。只需修改jdbc配置并将sql文件在数据库中运行即可运行。
  • 1 数据量评估 定时任务一般的使用场景是定时查询出一批数据,对这一批数据进行业务...假设定时任务部署了3台机器,在任务启动时3台机器竞争分布式锁,谁竞争到谁就执行,剩下2台不执行。分布式锁可以使用Redis或者Zoo
  • Quartz定时任务执行原理

    千次阅读 2019-05-27 18:19:22
    1、原理分析 ...quartz定时调度是通过Object.wait方式(native方法)实现的,其本质是通过操作系统的时钟来实现的。Quartz主要的执行类和执行方法。 其主要流程如下: public class QuartzSche...
  • misfire: ...4. 任务的串行执行; 如何判断misfire: 通过quartz配置 #激活失败容忍度,只有超过这个容忍度才会判定位misfire org.quartz.jobStore.misfireThreshold=30000 quartz中CornTrigger
  • quartz定时任务突然不执行

    千次阅读 2020-03-27 18:52:07
    高并发情况下,quartz定时任务突然不执行了, 背景: 整个项目架构,高并发操作比较多, 有多个线程池,周期线程池,和定时任务,占用多个资源 导致现场出现定时任务走一段时间就不走的情况 当前定时任务配置的是单...
  • java定时执行任务quartz定时执行任务
  • quartz定时任务实现只执行一次,以后不再执行

    万次阅读 热门讨论 2018-06-13 09:30:34
    那么定时任务也可以实现只执行一次的操作。配置如下&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;beans xmlns="http://www.springframework.org/schema/beans" ...
  • 定时任务不触发立即执行,等待下次Cron触发频率到达时刻开始按照Cron频率依次执行 扩展: scheduleBuilder.withMisfireHandlingInstructionDoNothing(); 不触发立即执行,等待下次Cron触发频率到达时刻开始按照...
  • **解决quartz定时任务被触发两次的问题: 其中告诉tomcat,在启动的时候加载webapps下的所有项目工程文件,又让tomcat再加载了一遍(一般情况下配置,主要是由于想域名访问时将工程名去掉的原因配置),这种情况下会...
  • quartz 定时任务不运行问题

    千次阅读 2021-03-01 17:24:02
    原因排查:发现是定时任务执行的方法中数据量过大导致方法执行过久(一个小时甚至更久),quartz默认情况下是单线程执行所有定时任务的,并且若当前任务处于执行中,当执行时间超过定时任务的间隔时间,后续定时任务...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,764
精华内容 9,105
关键字:

quartz定时任务没有执行