CN114020436A - 一种基于Quartz定时任务的领域任务实时调度方法 - Google Patents
一种基于Quartz定时任务的领域任务实时调度方法 Download PDFInfo
- Publication number
- CN114020436A CN114020436A CN202111320104.7A CN202111320104A CN114020436A CN 114020436 A CN114020436 A CN 114020436A CN 202111320104 A CN202111320104 A CN 202111320104A CN 114020436 A CN114020436 A CN 114020436A
- Authority
- CN
- China
- Prior art keywords
- task
- timing task
- timing
- configuration table
- quartz
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/4881—Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明涉及一种基于Quartz定时任务的领域任务实时调度方法,包括以下步骤:S1、通过初始化配置表,以配置定时任务,得到定时任务配置表;S2、构建多线程定时任务核心引擎;S3、通过遍历定时任务配置表,以创建定时任务;S4、远程调用定时任务对应的服务,并记录定时任务相应的执行数据,之后返回步骤S3,直至遍历完定时任务配置表中所有配置信息。与现有技术相比,本发明基于Quartz框架,通过定时任务配置表,采用Redis分布式锁规避多个定时任务争抢资源的问题;并运用RestTemplate结合定时任务配置表的方式,能够有效可靠地实现定时任务的灵活配置和领域任务的实时调度。
Description
技术领域
本发明涉及任务调度技术领域,尤其是涉及一种基于Quartz定时任务的领域任务实时调度方法。
背景技术
预审系统作为信用卡中心获客信审条线的桥头堡,涉及业务广泛且复杂,通常需要采用先进的领域驱动设计理念构建微服务系统,从而定时执行特定任务,实现业务目标,即需要借助定时任务在特定的时间或以特定的时间速率完成特定的任务,比如每隔一分钟将指纹设备数据送运营、每隔一分钟获取网申行为轨迹数据、每三分钟执行VIP队列异常重发、凌晨四点执行重复申请hold件下发任务等等。
现有的预审系统大多采用SpringCloud技术构建微服务,以实现领域服务的低耦合,各领域服务之间通过openfeign实现调用,赋能领域原子服务复用。系统采用集群方式部署,定时任务服务也随之会在多个节点启动,容易存在重复执行作业任务的情形,定时任务有时还需要承担调用领域任务的职责,也就无法灵活配置定时任务、不能实时调度领域任务。
发明内容
本发明的目的就是为了克服上述现有技术存在的缺陷而提供一种基于Quartz定时任务的领域任务实时调度方法,以避免重复执行任务,实现领域任务的实时调度。
本发明的目的可以通过以下技术方案来实现:一种基于Quartz定时任务的领域任务实时调度方法,包括以下步骤:
S1、通过初始化配置表,以配置定时任务,得到定时任务配置表;
S2、构建多线程定时任务核心引擎;
S3、通过遍历定时任务配置表,以创建定时任务;
S4、远程调用定时任务对应的服务,并记录定时任务相应的执行数据,之后返回步骤S3,直至遍历完定时任务配置表中所有配置信息。
进一步地,所述步骤S1中初始化配置表具体是在定时任务配置表中配置定时任务相应的核心字段。
进一步地,所述核心字段包括任务描述、CRON表达式、任务组名称、任务名称、状态、调度路径、网关路径、业务参数、Redis锁时间、Redis锁的key。
进一步地,所述状态对应的数值包括N和Y,其中,N为禁用状态,Y为启用状态;
所述Redis锁时间的单位设定为秒。
进一步地,所述步骤S2具体包括以下步骤:
S21、构造线程池调度器;
S22、将定时器注册器注入线程池调度器。
进一步地,所述步骤S3的具体过程为:
获取定时任务配置表,逐条遍历配置信息,针对每条配置信息,通过进行第一条件判断、第二条件判断、第三条件判断、第四条件判断、第五条件判断和第六条件判断,以创建定时任务。
进一步地,所述第一条件判断具体为:判断是否需要继续遍历,若判断为是,则执行第二条件判断,否则结束遍历过程;
所述第二条件判断具体为:判断配置信息是否为空,若判断为是,则返回遍历下一条配置信息,否则执行第三条件判断;
所述第三条件判断具体为:判断配置的定时任务是否已经在调度任务中存在,若判断为是,则执行第四条件判断,否则创建新的定时任务。
进一步地,所述第四条件判断具体为:判断配置的定时任务是否为禁用状态,若判断为是,则返回遍历下一条配置信息,否则执行第五条件判断;
所述第五条件判断具体为:判断是否有任务实例存在,若判断为是,则执行第六条件判断,否则删除已有的定时任务、创建新的定时任务;
所述第六条件判断具体为:判断任务实例是否发生变化,若判断为是,则删除已有的定时任务、创建新的定时任务,否则返回遍历下一条配置信息。
进一步地,所述步骤S4具体包括以下步骤:
S41、根据创建的新的定时任务,从定时任务配置表中获取对应的Redis锁key,若获取成功,则执行步骤S42,否则返回遍历下一条配置信息;
S42、执行远程服务调用定时任务配置表中配置的服务,并将调用结果以及定时任务的执行结果记录于日志表中;
S43、释放Redis锁,之后返回遍历下一条配置信息。
进一步地,所述步骤S42具体是通过RestTemplate远程服务调用定时任务配置表里配置的服务URL,发起http请求、完成Post调用,通过判断响应结果确定调用成功与否,并在定时调度日志表中新增日志,以记录定时任务的执行结果。
与现有技术相比,本发明具有以下优点:
一、本发明基于Quartz框架,结合Redis分布式锁,通过在定时任务配置表中配置定时任务,能够在分布式微服务架构下实现多任务节点并发启动,从而避免发生重复执行任务的现象、规避多个定时任务争抢资源的问题。
二、本发明通过遍历定时任务配置表中的配置信息,结合设定的多个条件判断,以保证定时任务创建的准确性和可靠性,同时结合远程服务调用,不仅能够实现定时任务的灵活配置,同时保证了领域任务的实时调度。
附图说明
图1为本发明的方法流程示意图;
图2为实施例的应用过程示意图;
图3为实施例中对应的时序图;
图4为实施例中对应的类图。
具体实施方式
下面结合附图和具体实施例对本发明进行详细说明。
实施例
Quartz是OpenSymphony开源组织在Jobscheduling领域又一开源项目,它可以与J2EE与J2SE应用程序相结合,也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或EJBs。
Quartz框架的核心是调度器。调度器负责管理Quartz的应用运行时环境。调度器不是靠自己做所有的工作,而是依赖框架内一些非常重要的部件。Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器用来执行预定的作业。这就是Quartz怎样能并发运行多个作业的原理。Quartz依赖一套松耦合的线程池管理部件来管理线程环境。
本技术方案借助Quartz框架,提出了一种基于Quartz的定时任务,以实现领域任务实时调度的解决方案。
如图1所示,一种基于Quartz定时任务的领域任务实时调度方法,包括以下步骤:
S1、通过初始化配置表,以配置定时任务,得到定时任务配置表,其中,初始化配置表具体是在定时任务配置表中配置定时任务相应的核心字段,核心字段包括任务描述、CRON表达式、任务组名称、任务名称、状态(对应的数值包括N和Y,N为禁用状态,Y为启用状态)、调度路径、网关路径、业务参数、Redis锁时间、Redis锁的key;
本实施例中,Redis锁时间的单位设定为秒;
S2、构建多线程定时任务核心引擎:首先构造线程池调度器;再将定时器注册器注入线程池调度器;
S3、通过遍历定时任务配置表,以创建定时任务,具体的:
获取定时任务配置表,逐条遍历配置信息,针对每条配置信息,通过进行第一条件判断、第二条件判断、第三条件判断、第四条件判断、第五条件判断和第六条件判断,以创建定时任务;
其中,第一条件判断具体为:判断是否需要继续遍历,若判断为是,则执行第二条件判断,否则结束遍历过程;
第二条件判断具体为:判断配置信息是否为空,若判断为是,则返回遍历下一条配置信息,否则执行第三条件判断;
第三条件判断具体为:判断配置的定时任务是否已经在调度任务中存在,若判断为是,则执行第四条件判断,否则创建新的定时任务;
第四条件判断具体为:判断配置的定时任务是否为禁用状态,若判断为是,则返回遍历下一条配置信息,否则执行第五条件判断;
第五条件判断具体为:判断是否有任务实例存在,若判断为是,则执行第六条件判断,否则删除已有的定时任务、创建新的定时任务;
第六条件判断具体为:判断任务实例是否发生变化,若判断为是,则删除已有的定时任务、创建新的定时任务,否则返回遍历下一条配置信息;
S4、远程调用定时任务对应的服务,并记录定时任务相应的执行数据,之后返回步骤S3,直至遍历完定时任务配置表中所有配置信息,具体的:
首先根据创建的新的定时任务,从定时任务配置表中获取对应的Redis锁key,若获取成功,则执行步骤S42,否则返回遍历下一条配置信息;
之后执行远程服务调用定时任务配置表中配置的服务,并将调用结果以及定时任务的执行结果记录于日志表中,本实施例通过RestTemplate远程服务调用定时任务配置表里配置的服务URL,发起http请求、完成Post调用,通过判断响应结果确定调用成功与否,并在定时调度日志表中新增日志,以记录定时任务的执行结果;
S43、释放Redis锁,之后返回遍历下一条配置信息。
本实施例应用上述方法,通过继承Quartz框架的QuartzJobBean类,重写executeInternal方法,在executeInternal方法内部结合Redis分布式锁,实现了分布式微服务架构下多任务节点并发启动而不发生重复执行任务的功能。本实施例的具体应用流程如图2所示:
(1)、配置定时任务信息。在定时任务配置表OPAS_CFG_JOB_INFO配置定时任务,数据表核心字段包括:任务描述、CRON表达式、任务组名称、任务名称、状态(N:禁用,Y:启用)、调度路径、网关路径、业务参数、redis锁时间(秒)、redis锁的key。
(2)、构建定时器。首先构建线程池调度器,其次定时器注册器注入线程池调度器,多线程定时任务核心引擎组装完毕。
(3)、遍历定时任务配置表OPAS_CFG_JOB_INFO,开始创建定时任务。获取到定时任务配置信息集合以后,逐条遍历配置信息,首先判断是否配置信息为空,为空则跳过此次遍历;不为空则开始判断已配置的定时任务是否已经在定时调度任务中存在。如果不存在,则创建新的定时任务;如果存在,则判断定时任务是否被禁用,如果被禁用则跳过此次遍历,继续遍历下一条配置信息,如果启用,则获取已存在的任务实例,如果实例不存在,则执行(4),如果存在则判断任务配置信息是否有变化,如果没变化,则跳过此次遍历,继续遍历下一条配置信息,如果有变化,则执行(4)。
(4)、刷新定时任务。首先在定时计划中删除已有的定时任务,然后开始创建新的定时任务。获取定时任务配置表OPAS_CFG_JOB_INFO里的Redis锁key,判断是否获取到Redis锁,如果没有获取到,则跳过此次遍历,继续遍历下一条配置信息;如果获取到了,则通过RestTemplate远程服务调用定时任务配置表OPAS_CFG_JOB_INFO里配置的服务URL,发起http请求,完成Post调用,通过判断响应结果确定调用成功与否并在定时调度日志表OPAS_BIZ_JOB_LOG新增日志记录定时任务的执行情况,最后释放Redis锁,交出控制权,紧接着继续遍历下一条配置信息,直到所有配置信息遍历完毕。
如图3的时序图所示,工程启动以后,首先在SchedulingConfig的configureTasks()方法里实现初始化加载,TaskScheduler构造多线程调度器并注入到定时任务注册器的ScheduledTaskRegistrar里,形成定时任务调度器的核心引擎,定时任务注册器ScheduledTaskRegistrar开启一个定时任务IntervalTask,任务执行的内容为SchedulerRefreshService接口的scheduleUpdate()方法,scheduleUpdate()方法通过调用JobInfoService接口的findAll()方法,获取定时任务配置信息,并执行executJobInfo()方法开始遍历配置信息,executJobInfo()方法通过引用ScheduleUtil类的getCronTrigger()方法获取定时调度任务,通过deleteJob()方法移除调度任务,通过updateJob()方法刷新调度任务,通过createJob()方法创建调度任务,createJob()方法会引用TaskJob类的executeInternal()方法开始创建调度任务,executeInternal()方法通过RedisSupportUtils类的isAbsentKey()获取Redis锁,通过executeJob()方法通过引用RestTemplateConfig类的restTemplate().postForEntity()方法执行RestTemplate远程服务调用。
本实施例对应的类图如图4所示,BaseMapper接口继承顶级接口Mapper,JobInfoMapper接口继承BaseMapper,通过重写父类接口方法,实现定时任务配置表的读写原子操作并注入JobInfoServiceImpl实现类,JobInfoServiceImpl类实现了JobInfoService接口,通过方法重写,实现了定时任务的业务逻辑,JobInfoService被SchedulerRefreshServiceImpl类引用。
JobDetail接口继承了Serializable接口和Cloneable,实现了定时任务实体的序列化和参数克隆功能,TaskJob类通过引入JobDetail接口、RedisSupportUtils类的isAbsentKey()方法并实现QuartzJobBean接口,实现了Redis分布式锁和定时任务的调度,TaskJob类被ScheduleUtil类引用。
SchedulerRefreshServiceImpl实现了SchedulerRefreshService接口,通过引入Scheduler接口,结合scheduleUpdate()方法实现了刷新定时任务调度的功能,引入ScheduleUtil,实现了定时任务的创建、移除等操作。
SchedulingConfig类实现SchedulingConfigurer接口,通过重写configureTasks()方法,初始化定时器配置并构建调度引擎,引入SchedulerRefreshService接口,实现了领域任务的实时调度。
综上可知,本技术方案在定时任务配置表OPAS_CFG_JOB_INFO配置定时任务;结合RestTemplate远程服务以及定时任务配置表进行配置信息遍历。通过采用Redis分布式锁规避多个定时任务争抢资源的问题;运用RestTemplate结合定时任务配置表的方式实现定时任务的灵活配置和领域任务的实时调度。
Claims (10)
1.一种基于Quartz定时任务的领域任务实时调度方法,其特征在于,包括以下步骤:
S1、通过初始化配置表,以配置定时任务,得到定时任务配置表;
S2、构建多线程定时任务核心引擎;
S3、通过遍历定时任务配置表,以创建定时任务;
S4、远程调用定时任务对应的服务,并记录定时任务相应的执行数据,之后返回步骤S3,直至遍历完定时任务配置表中所有配置信息。
2.根据权利要求1所述的一种基于Quartz定时任务的领域任务实时调度方法,其特征在于,所述步骤S1中初始化配置表具体是在定时任务配置表中配置定时任务相应的核心字段。
3.根据权利要求2所述的一种基于Quartz定时任务的领域任务实时调度方法,其特征在于,所述核心字段包括任务描述、CRON表达式、任务组名称、任务名称、状态、调度路径、网关路径、业务参数、Redis锁时间、Redis锁的key。
4.根据权利要求3所述的一种基于Quartz定时任务的领域任务实时调度方法,其特征在于,所述状态对应的数值包括N和Y,其中,N为禁用状态,Y为启用状态;
所述Redis锁时间的单位设定为秒。
5.根据权利要求1所述的一种基于Quartz定时任务的领域任务实时调度方法,其特征在于,所述步骤S2具体包括以下步骤:
S21、构造线程池调度器;
S22、将定时器注册器注入线程池调度器。
6.根据权利要求4所述的一种基于Quartz定时任务的领域任务实时调度方法,其特征在于,所述步骤S3的具体过程为:
获取定时任务配置表,逐条遍历配置信息,针对每条配置信息,通过进行第一条件判断、第二条件判断、第三条件判断、第四条件判断、第五条件判断和第六条件判断,以创建定时任务。
7.根据权利要求6所述的一种基于Quartz定时任务的领域任务实时调度方法,其特征在于,所述第一条件判断具体为:判断是否需要继续遍历,若判断为是,则执行第二条件判断,否则结束遍历过程;
所述第二条件判断具体为:判断配置信息是否为空,若判断为是,则返回遍历下一条配置信息,否则执行第三条件判断;
所述第三条件判断具体为:判断配置的定时任务是否已经在调度任务中存在,若判断为是,则执行第四条件判断,否则创建新的定时任务。
8.根据权利要求7所述的一种基于Quartz定时任务的领域任务实时调度方法,其特征在于,所述第四条件判断具体为:判断配置的定时任务是否为禁用状态,若判断为是,则返回遍历下一条配置信息,否则执行第五条件判断;
所述第五条件判断具体为:判断是否有任务实例存在,若判断为是,则执行第六条件判断,否则删除已有的定时任务、创建新的定时任务;
所述第六条件判断具体为:判断任务实例是否发生变化,若判断为是,则删除已有的定时任务、创建新的定时任务,否则返回遍历下一条配置信息。
9.根据权利要求3所述的一种基于Quartz定时任务的领域任务实时调度方法,其特征在于,所述步骤S4具体包括以下步骤:
S41、根据创建的新的定时任务,从定时任务配置表中获取对应的Redis锁key,若获取成功,则执行步骤S42,否则返回遍历下一条配置信息;
S42、执行远程服务调用定时任务配置表中配置的服务,并将调用结果以及定时任务的执行结果记录于日志表中;
S43、释放Redis锁,之后返回遍历下一条配置信息。
10.根据权利要求9所述的一种基于Quartz定时任务的领域任务实时调度方法,其特征在于,所述步骤S42具体是通过RestTemplate远程服务调用定时任务配置表里配置的服务URL,发起http请求、完成Post调用,通过判断响应结果确定调用成功与否,并在定时调度日志表中新增日志,以记录定时任务的执行结果。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111320104.7A CN114020436A (zh) | 2021-11-09 | 2021-11-09 | 一种基于Quartz定时任务的领域任务实时调度方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111320104.7A CN114020436A (zh) | 2021-11-09 | 2021-11-09 | 一种基于Quartz定时任务的领域任务实时调度方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114020436A true CN114020436A (zh) | 2022-02-08 |
Family
ID=80062842
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111320104.7A Pending CN114020436A (zh) | 2021-11-09 | 2021-11-09 | 一种基于Quartz定时任务的领域任务实时调度方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114020436A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115934287A (zh) * | 2022-12-27 | 2023-04-07 | 无锡锡银金科信息技术有限责任公司 | 应用系统多服务集群下定时任务调度方法 |
-
2021
- 2021-11-09 CN CN202111320104.7A patent/CN114020436A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115934287A (zh) * | 2022-12-27 | 2023-04-07 | 无锡锡银金科信息技术有限责任公司 | 应用系统多服务集群下定时任务调度方法 |
CN115934287B (zh) * | 2022-12-27 | 2023-09-12 | 无锡锡银金科信息技术有限责任公司 | 应用系统多服务集群下定时任务调度方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10776147B2 (en) | Orchestration engine for migrating application data and application services using migration steps in migration component | |
US8108834B2 (en) | Defining and executing processes using declarative programming language constructs | |
US7451432B2 (en) | Transformation of componentized and extensible workflow to a declarative format | |
US20070276692A1 (en) | Method for Debugging a Business Process Flow | |
US20110276968A1 (en) | Event driven change injection and dynamic extensions to a bpel process | |
US7640538B2 (en) | Virtual threads in business process programs | |
WO2016008376A1 (zh) | 一种可动态调整的任务调度系统和调度方法 | |
Kheldoun et al. | Specification and verification of complex business processes-a high-level petri net-based approach | |
CN114020436A (zh) | 一种基于Quartz定时任务的领域任务实时调度方法 | |
US20030144891A1 (en) | Supervising the processing status of activities within workflow management systems | |
CN112015528B (zh) | 一种工业控制系统软件控制流程构建和解析方法 | |
US8341596B2 (en) | Method and system for controlling the re-execution of a rule branch | |
Kohlmeyer et al. | Unifying the semantics of UML 2 state, activity and interaction diagrams | |
Schneider et al. | A test concept for the development of microservice-based applications | |
US7913259B2 (en) | Task-graph for process synchronization and control | |
Montesi et al. | Dynamic fault handling mechanisms for service-oriented applications | |
Chebout | AOM4JADE: an aspect-oriented monitoring approach for JADE-based multi-agent applications | |
Pierre et al. | A Family-based Framework for i-DSML Adaptation | |
Nikiforova et al. | Application of BPMN instead of GRAPES for two-hemisphere model driven approach | |
Huang et al. | On mechanisms for deadlock avoidance in SIP servlet containers | |
Leff et al. | Wso: Developer-oriented transactional orchestration of web-services | |
Qiao et al. | Implementing dynamic management for mediated service interactions | |
AlSobeh | Improving reuse of distributed transaction software with transaction-aware aspects | |
Mani et al. | Testing Multi-agent Systems for Deadlock Detection Based on UML Models. | |
Köllmann et al. | Synchronization Patterns for Process-Driven and Service-Oriented Architectures. |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |