CN111752696B - 一种基于rpc及线程锁的分布式定时任务调度方法 - Google Patents

一种基于rpc及线程锁的分布式定时任务调度方法 Download PDF

Info

Publication number
CN111752696B
CN111752696B CN202010615472.3A CN202010615472A CN111752696B CN 111752696 B CN111752696 B CN 111752696B CN 202010615472 A CN202010615472 A CN 202010615472A CN 111752696 B CN111752696 B CN 111752696B
Authority
CN
China
Prior art keywords
task
scheduling
dispatching
executor
execution
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.)
Active
Application number
CN202010615472.3A
Other languages
English (en)
Other versions
CN111752696A (zh
Inventor
严东
李耀
田骏
彭磊
杨志文
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Wuhan Zhongbang Bank Co Ltd
Original Assignee
Wuhan Zhongbang Bank Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Wuhan Zhongbang Bank Co Ltd filed Critical Wuhan Zhongbang Bank Co Ltd
Priority to CN202010615472.3A priority Critical patent/CN111752696B/zh
Publication of CN111752696A publication Critical patent/CN111752696A/zh
Application granted granted Critical
Publication of CN111752696B publication Critical patent/CN111752696B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/48Program initiating; Program switching, e.g. by interrupt
    • G06F9/4806Task transfer initiation or dispatching
    • G06F9/4812Task transfer initiation or dispatching by interrupt, e.g. masked
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/547Remote procedure calls [RPC]; Web services
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

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

本发明涉及信息技术领域,提供了一种基于RPC及线程锁的分布式定时任务调度方法。的目的在于解决传统的定时任务产生堆积,导致定时任务执行准确性和频率性出现故障的问题。主要方案包括,新建定时任务执行器;在调度中心里,新建调度任务;调度中心的调度任务通过已注册的各任务执行器上报任务,将调度任务存到数据库中,执行时会从数据库中取出调度任务,执行具体任务;对执行器发出RPC心跳检测请求,第一个检测为存活状态的执行器会被选定并发送调度请求;任务执行器接收到调度请求后,会根据调度请求实例化一个任务线程,执行任务线程中具体的作业程序处理方法,成功后返回SUCCESS响应消息。

Description

一种基于RPC及线程锁的分布式定时任务调度方法
技术领域
本发明涉及信息技术领域,提供了一种基于RPC及线程锁的分布式定时任务调度方法。
背景技术
定时任务调度是一种按照指定时间策略周期性执行任务的应用业务系统或模块,是应用软件中一个常见的模块,用于处理需重复并周期性调用的任务,定时任务调度一般被用于数据同步、交易对账、异常处理等场景中。
传统的定时任务通常都是在不同的主机独立运行的,随着定时任务量的增加,运行定时任务需要的资源就会相应增加,到一定的任务量会导致性能瓶颈,任务量产生堆积,导致定时任务执行准确性和频率性出现故障。
将定时任务系统扩展到一个分布式集群中是一种可行的改进方法,但由于分布式系统的复杂性,导致分布式定时任务系统的稳定性和可靠性都难以保证。
发明内容
本发明的目的在于解决传统的定时任务通常都是在不同的主机独立运行的,随着定时任务量的增加,运行定时任务需要的资源就会相应增加,到一定的任务量会导致性能瓶颈,任务量产生堆积,导致定时任务执行准确性和频率性出现故障的问题。
本发明为解决上述技术问题,采用以下技术方案:
一种基于RPC及线程锁的分布式定时任务调度方法,其特征在于,包括以下步骤:
步骤1:新建定时任务执行器,得到任务执行器JobHandler,在任务执行器中开发job类,job类中定义了定时任务的时间表达式、定时任务的具体执行方法、定时任务的返回结果集,并最终得到处理结果;
步骤2:在调度中心里,新建调度任务,调度任务用于定义调度的方法名称、时间、对应的job类、调度的超时时间、失败后的处理方式;
步骤3:调度中心的调度任务通过已注册的各任务执行器上报任务,将调度任务存到数据库中,执行时会从数据库中取出调度任务,执行具体任务;
步骤4:任务执行器采取集群部署,调度中心会感知在线的所有执行器,每次请求时,会按照顺序对执行器发出RPC心跳检测请求,第一个检测为存活状态的执行器会被选定并发送调度请求;
步骤5:任务执行器接收到调度请求后,会根据调度请求实例化一个任务线程,执行任务线程中具体的作业程序处理方法,成功后返回SUCCESS响应消息;
步骤6:调度时,会在日志中心记录一条任务日志,包括任务信息、调度信息、执行信息,任务日志可在日志中心按照日期和状态检索查看并得知定时任务执行结果,至此,整个调度任务周期结束。
上述技术方案中,调度相应的调度任务时,采用线程池方式实现,执行时取出线程并加锁,避免线程被占用而引起阻塞。
上述技术方案中,步骤1具体包括:
步骤1.1:使用spring容器环境新建定时任务执行器,执行器的配置文件需定义任务执行器名称,所在服务器的ip地址和自定义端口;
步骤1.2:在spring bean实例中,开发job方法,此job方法的Java类格式要求为”public ReturnT<String>execute(String param)”;
步骤1.3:为job方法添加注解”@Job(value=”自定义的jobhandler名称,init=”JobHandler初始化方法”,destroy=”JobHandler销毁方法”)”,该注解可以在执行类启动时,在Java虚拟机中自动识别并按照注解的定丈来初始化和销毁执行方法,注解value值对应的是调度中心新建调度任务的名称,init对应调度任务的初始化方法,destroy对应调度任务的销毁方法。
步骤1.4:配置完成后,Java虚拟机会根据注解信息生成作业处理程序,通过调度中心新建的任务也会以作业处理程序的形式存在于任务执行器中,Java虚拟机会扫描步骤1.3中添加的注解,发现任务并注入到执行容器中。
上述技术方案中,步骤2具体包括:
步骤2.1:进入调度中心,在任务执行器中选择步骤1中定义的执行器名称,任务描述简述定时任务的执行目的,定时任务的阻塞策略,cron定义定时任务的定时执行时间规则,定义执行器中的任务方法名称;
步骤2.2:配置完成并保存后,此调度任务会在数据库新增一条定时任务信息,定时调度任务新增成功。
上述技术方案中,步骤3具体包括:
步骤3.1:调度中心通过数据库扫描调度任务时,通过任务执行器的心跳反应判断当前集群中存活的任务执行器,在调度任务数据中加入存活的任务执行器ID,将调度任务与执行器通过ID映射进行关系对应,由调度中心通知给各执行器;
步骤3.2:调度中心判断有任务需要被执行时,从数据库中取出已在调度中心配置的触发器数据,由Java虚拟机实例化此定时任务触发器来执行;
步骤3.3:如果实例化的定时任务触发器的名称和执行的时间相同,进行去重判断,只有一个节点去执行此任务。
上述技术方案中,调度相应的调度任务时,采用线程池方式实现,执行时取出线程并加锁,避免线程被占用而引起阻塞,具体包括以下步骤:
步骤A.1:调度中心添加一个已上报的定时调度任务到quartz中,quartz是一个完全由Java编写的开源作业调度框架;
步骤A.2:quartz通过快慢线程池去执行已实例化的触发器,1分钟内若有10次运行超过500ms就会启动慢线程池,否者就进入快线程池;
步骤A.3:通过定时调度任务在实例化时由调度中心分配的任务ID字段查询数据库中保存的定时任务信息,将任务实例装载到线程池中,并调用执行触发程序;
步骤A.4:从数据库中获取任务的线程阻塞策略,默认是serial execution串行执行,根据任务ID对定时任务执行线程加锁,并继续递交给执行器执行。
上述技术方案中,步骤4具体包括:
步骤4.1:调度中心实例化一个RpcReferenceBean实例,此实例是RPC调用方法的应用类,用于包装RPC服务,进行消息的放松和接收,通过此实例初始化一个netty_http服务端和客户端;
步骤4.2:实例化一个RpcRequest实例,此实例包装RPC的消息请求发送服务,调用步骤4.1中的netty_http服务端的asyncSend方法,将RPC请求通过异步发送的方式,发送给任务客户端,并获得具体任务的请求结果;
步骤4.3:RPC消息实例通过getPool方法,从步骤4.1中实例的RpcReferenceBean中初始化的netty_http中获取客户端的连接池;
步骤4.4:通过连接池获取netty_http客户端服务连接,调用其send方法发送任务调度请求,由任务客户端接收任务请求并处理具体任务;
步骤4.5:发送请求时使用对象封装调度请求参数和响应数据,在进行通讯之前底层会将上述两个对象序列化,并进行数据协议以及时间戳检验,达到数据加密的功能;
步骤4.6:netty_http客户端会尝试与数据库记录的所有执行器进行消息通信,当收到500的响应码时,自动转移请求到下一个任务执行器,直到有任务执行器返回200响应码,发送实际定时任务id到第一个检测为存活状态的任务执行中。
上述技术方案中,步骤5具体包括:
步骤5.1:执行器在收到调度中心的请求后,采取实例化JobSpringExecutor类的手段,此类是在应用的Spring容器中注入任务执行器实例,对其start方法进行调用,start方法可以启用实例的初始化方法,使此实例进行初始化;
步骤5.2:在start方法中,采用通过配置的ip,port,appName初始化RpcProviderFactory,此类会生成一个RPC的服务提供产品工程,对ExecutorBizlmpl这个执行类进行添加,此执行类会处理RPC服务中具体的请求发送和应答接收的事务;
步骤5.3:采取使用一个守护线程启动netty的http服务端的手段,对netty服务端中的channelRead方法进行执行,此方法可以获取服务端的连接管道,通过管道对任务的服务端进行请求发送;
步骤5.4:采取通过请求过来的类名作为key获取对应的serviceBean的手段,通过反射调用,对ExecutorBizlmpl的run方法去执行,此方法会去执行具体的任务线程;
步骤5.5:采取获取定时任务id的手段,对JobThread线程进行实例化并进行调用,JobThread为任务线程实例,作业处理程序的具体实现逻辑包装在此实例中;
步骤5.6:执行对应的handler.execute,此方法将其放进触发器队列中,执行具体作业处理程序的处理逻辑,当作业程序处理成功,返回ReturnT.SUCCESS执行完成。
上述技术方案中,步骤6具体包括:
步骤6.1:每次调度请求生成一个单独的日志文件,通过log打印执行日志;
步骤6.2:调度中心会加载对应的日志文件,可查看对应的执行日志;
步骤6.3:日志文件的存放位置可在执行器配置文件进行自定丈;
步骤6.4:在日志中打印任务ID和任务执行器名称,方便日志追踪。
本发明因为采用上述技术方案,因此具备以下有益效果:
一、执行器的分布式任务执行,执行器会周期性自动注册任务,调度中心将会自动发现注册的任务并触发执行,同时,也支持手动录入执行器地址。
二、调度系统多线程触发调度运行,确保调度精确执行,线程之间有互斥锁,可互相隔离调用,互不干扰,不被堵塞,调度线程池进行了隔离拆分,慢任务自动降级进入慢线程池,避免线程耗尽调度线程资源,提高系统稳定性。
三、执行器集群部署时提供丰富的路由策略,包括第一个、最后一个、轮询、随机等策略,任务路由在故障转移情况下,如果执行器集群中某一台机器故障,将会自动Failover切换到一台正常的执行器发送调度请求。
四、调度过于密集执行器来不及处理时的处理策略,包括单机串行、丢弃后续调度、覆盖之前调度;支持自定义任务超时时间,任务运行超时将会主动中断任务;支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试。
五、本申请采用分布式定时任务调度方法,区别现有主流的单机定时任务执行,增加了定时任务的执行效率和稳定性。
六、现有集群采用API的方式对任务进行管理,系统侵入严重,调度逻辑与业务过度耦合,本技术采用执行器模式实现协同分配式运行任务,充分发挥集群优势,负载各节点均衡,调度与任务完全解耦,调度模块进行任务调度时,将会解析不同的任务参数发起远程调用,调用各自的远程执行器服务,调用中心提供调用代理的功能,而执行器提供远程服务的功能。
附图说明
图1为本发明流程简图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明,即所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。
因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
需要说明的是,术语“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
一种基于RPC及线程锁的分布式定时任务调度方法,其特征在于,包括以下步骤:
步骤1:新建定时任务执行器,得到任务执行器JobHandler,在任务执行器中开发job类,job类中定义了定时任务的时间表达式、定时任务的具体执行方法、定时任务的返回结果集,并最终得到处理结果;
步骤2:在调度中心里,新建调度任务,调度任务用于定义调度的方法名称、时间、对应的job类、调度的超时时间、失败后的处理方式;
步骤3:调度中心的调度任务通过已注册的各任务执行器上报任务,将调度任务存到数据库中,执行时会从数据库中取出调度任务,执行具体任务;
步骤4:任务执行器采取集群部署,调度中心会感知在线的所有执行器,每次请求时,会按照顺序对执行器发出RPC心跳检测请求,第一个检测为存活状态的执行器会被选定并发送调度请求;
步骤5:任务执行器接收到调度请求后,会根据调度请求实例化一个任务线程,执行任务线程中具体的作业程序处理方法,成功后返回SUCCESS响应消息;
步骤6:调度时,会在日志中心记录一条任务日志,包括任务信息、调度信息、执行信息,任务日志可在日志中心按照日期和状态检索查看并得知定时任务执行结果,至此,整个调度任务周期结束。
上述技术方案中,调度相应的调度任务时,采用线程池方式实现,执行时取出线程并加锁,避免线程被占用而引起阻塞。
上述技术方案中,步骤1具体包括:
步骤1.1:使用spring容器环境新建定时任务执行器,执行器的配置文件需定义任务执行器名称,所在服务器的ip地址和自定义端口;
步骤1.2:在spring bean实例中,开发job方法,此job方法的Java类格式要求为”public ReturnT<String>execute(String param)”;
步骤1.3:为job方法添加注解”@Job(value=”自定义的jobhandler名称,init=”JobHandler初始化方法”,destroy=”JobHandler销毁方法”)”,该注解可以在执行类启动时,在Java虚拟机中自动识别并按照注解的定丈来初始化和销毁执行方法,注解value值对应的是调度中心新建调度任务的名称,init对应调度任务的初始化方法,destroy对应调度任务的销毁方法。
步骤1.4:配置完成后,Java虚拟机会根据注解信息生成作业处理程序,通过调度中心新建的任务也会以作业处理程序的形式存在于任务执行器中,Java虚拟机会扫描步骤1.3中添加的注解,发现任务并注入到执行容器中。
上述技术方案中,步骤2具体包括:
步骤2.1:进入调度中心,在任务执行器中选择步骤1中定义的执行器名称,任务描述简述定时任务的执行目的,定时任务的阻塞策略,cron定义定时任务的定时执行时间规则,定义执行器中的任务方法名称;
步骤2.2:配置完成并保存后,此调度任务会在数据库新增一条定时任务信息,定时调度任务新增成功。
上述技术方案中,步骤3具体包括:
步骤3.1:调度中心通过数据库扫描调度任务时,通过任务执行器的心跳反应判断当前集群中存活的任务执行器,在调度任务数据中加入存活的任务执行器ID,将调度任务与执行器通过ID映射进行关系对应,由调度中心通知给各执行器;
步骤3.2:调度中心判断有任务需要被执行时,从数据库中取出已在调度中心配置的触发器数据,由Java虚拟机实例化此定时任务触发器来执行;
步骤3.3:如果实例化的定时任务触发器的名称和执行的时间相同,进行去重判断,只有一个节点去执行此任务。
上述技术方案中,调度相应的调度任务时,采用线程池方式实现,执行时取出线程并加锁,避免线程被占用而引起阻塞,具体包括以下步骤:
步骤A.1:调度中心添加一个已上报的定时调度任务到quartz中,quartz是一个完全由Java编写的开源作业调度框架;
步骤A.2:quartz通过快慢线程池去执行已实例化的触发器,1分钟内若有10次运行超过500ms就会启动慢线程池,否者就进入快线程池;
步骤A.3:通过定时调度任务在实例化时由调度中心分配的任务ID字段查询数据库中保存的定时任务信息,将任务实例装载到线程池中,并调用执行触发程序;
步骤A.4:从数据库中获取任务的线程阻塞策略,默认是serial execution串行执行,根据任务ID对定时任务执行线程加锁,并继续递交给执行器执行。
上述技术方案中,步骤4具体包括:
步骤4.1:调度中心实例化一个RpcReferenceBean实例,此实例是RPC调用方法的应用类,用于包装RPC服务,进行消息的放松和接收,通过此实例初始化一个netty_http服务端和客户端;
步骤4.2:实例化一个RpcRequest实例,此实例包装RPC的消息请求发送服务,调用步骤4.1中的netty_http服务端的asyncSend方法,将RPC请求通过异步发送的方式,发送给任务客户端,并获得具体任务的请求结果;
步骤4.3:RPC消息实例通过getPool方法,从步骤4.1中实例的RpcReferenceBean中初始化的netty_http中获取客户端的连接池;
步骤4.4:通过连接池获取netty_http客户端服务连接,调用其send方法发送任务调度请求,由任务客户端接收任务请求并处理具体任务;
步骤4.5:发送请求时使用对象封装调度请求参数和响应数据,在进行通讯之前底层会将上述两个对象序列化,并进行数据协议以及时间戳检验,达到数据加密的功能;
步骤4.6:netty_http客户端会尝试与数据库记录的所有执行器进行消息通信,当收到500的响应码时,自动转移请求到下一个任务执行器,直到有任务执行器返回200响应码,发送实际定时任务id到第一个检测为存活状态的任务执行中。
上述技术方案中,步骤5具体包括:
步骤5.1:执行器在收到调度中心的请求后,采取实例化JobSpringExecutor类的手段,此类是在应用的Spring容器中注入任务执行器实例,对其start方法进行调用,start方法可以启用实例的初始化方法,使此实例进行初始化;
步骤5.2:在start方法中,采用通过配置的ip,port,appName初始化RpcProviderFactory,此类会生成一个RPC的服务提供产品工程,对ExecutorBizlmpl这个执行类进行添加,此执行类会处理RPC服务中具体的请求发送和应答接收的事务;
步骤5.3:采取使用一个守护线程启动netty的http服务端的手段,对netty服务端中的channelRead方法进行执行,此方法可以获取服务端的连接管道,通过管道对任务的服务端进行请求发送;
步骤5.4:采取通过请求过来的类名作为key获取对应的serviceBean的手段,通过反射调用,对ExecutorBizlmpl的run方法去执行,此方法会去执行具体的任务线程;
步骤5.5:采取获取定时任务id的手段,对JobThread线程进行实例化并进行调用,JobThread为任务线程实例,作业处理程序的具体实现逻辑包装在此实例中;
步骤5.6:执行对应的handler.execute,此方法将其放进触发器队列中,执行具体作业处理程序的处理逻辑,当作业程序处理成功,返回ReturnT.SUCCESS执行完成。
上述技术方案中,步骤6具体包括:
步骤6.1:每次调度请求生成一个单独的日志文件,通过log打印执行日志;
步骤6.2:调度中心会加载对应的日志文件,可查看对应的执行日志;
步骤6.3:日志文件的存放位置可在执行器配置文件进行自定丈;
步骤6.4:在日志中打印任务ID和任务执行器名称,方便日志追踪。

Claims (7)

1.一种基于RPC及线程锁的分布式定时任务调度方法,其特征在于,包括以下步骤:
步骤1:新建定时任务执行器,得到任务执行器JobHandler,在任务执行器中开发job类,job类中定义了定时任务的时间表达式、定时任务的具体执行方法、定时任务的返回结果集,并最终得到处理结果;
步骤2:在调度中心里,新建调度任务,调度任务用于定义调度的方法名称、时间、对应的job类、调度的超时时间、失败后的处理方式;
步骤3:调度中心的调度任务通过已注册的各任务执行器上报任务,将调度任务存到数据库中,执行时会从数据库中取出调度任务,执行具体任务;
步骤4:任务执行器采取集群部署,调度中心会感知在线的所有执行器,每次请求时,会按照顺序对执行器发出RPC心跳检测请求,第一个检测为存活状态的执行器会被选定并发送调度请求;
步骤5:任务执行器接收到调度请求后,会根据调度请求实例化一个任务线程,执行任务线程中具体的作业程序处理方法,成功后返回SUCCESS响应消息;
步骤6:调度时,会在日志中心记录一条任务日志,包括任务信息、调度信息、执行信息,任务日志可在日志中心按照日期和状态检索查看并得知定时任务执行结果,至此,整个调度任务周期结束;
调度相应的调度任务时,采用线程池方式实现,执行时取出线程并加锁,避免线程被占用而引起阻塞,具体包括以下步骤:
步骤A.1:调度中心添加一个已上报的定时调度任务到quartz中,quartz是一个完全由Java编写的开源作业调度框架;
步骤A.2:quartz通过快慢线程池去执行已实例化的触发器,1分钟内若有10次运行超过500ms就会启动慢线程池,否则就进入快线程池;
步骤A.3:通过定时调度任务在实例化时由调度中心分配的任务ID字段查询数据库中保存的定时任务信息,将任务实例装载到线程池中,并调用执行触发程序;
步骤A.4:从数据库中获取任务的线程阻塞策略,默认是serial execution串行执行,根据任务ID对定时任务执行线程加锁,并继续递交给执行器执行。
2.根据权利要求1所述的一种基于RPC及线程锁的分布式定时任务调度方法,其特征在于,步骤1具体包括:
步骤1.1:使用spring容器环境新建定时任务执行器,执行器的配置文件需定义任务执行器名称,所在服务器的ip地址和自定义端口;
步骤1.2:在spring bean实例中,开发job方法,此job方法的Java类格式要求为”public ReturnT<String> execute(String param)”;
步骤1.3:为job方法添加注解”@Job(value=”自定义的jobhandler名称,init=”JobHandler初始化方法”,destroy=”JobHandler销毁方法”)”,该注解可以在执行类启动时,在Java虚拟机中自动识别并按照注解的定义来初始化和销毁执行方法,注解value值对应的是调度中心新建调度任务的名称,init对应调度任务的初始化方法,destroy对应调度任务的销毁方法;
步骤1.4:配置完成后,Java虚拟机会根据注解信息生成作业处理程序,通过调度中心新建的任务也会以作业处理程序的形式存在于任务执行器中,Java虚拟机会扫描步骤1.3中添加的注解,发现任务并注入到执行容器中。
3.根据权利要求1所述的一种基于RPC及线程锁的分布式定时任务调度方法,其特征在于,步骤2具体包括:
步骤2.1:进入调度中心,在任务执行器中选择步骤1中定义的执行器名称,任务描述简述定时任务的执行目的,定时任务的阻塞策略,cron定义定时任务的定时执行时间规则,定义执行器中的任务方法名称;
步骤2.2:配置完成并保存后,此调度任务会在数据库新增一条定时任务信息,定时调度任务新增成功。
4.根据权利要求1所述的一种基于RPC及线程锁的分布式定时任务调度方法,其特征在于,步骤3具体包括:
步骤3.1:调度中心通过数据库扫描调度任务时,通过任务执行器的心跳反应判断当前集群中存活的任务执行器,在调度任务数据中加入存活的任务执行器ID,将调度任务与执行器通过ID映射进行关系对应,由调度中心通知给各执行器;
步骤3.2:调度中心判断有任务需要被执行时,从数据库中取出已在调度中心配置的触发器数据,由Java虚拟机实例化此定时任务触发器来执行;
步骤3.3:如果实例化的定时任务触发器的名称和执行的时间相同,进行去重判断,只有一个节点去执行此任务。
5.根据权利要求1所述的一种基于RPC及线程锁的分布式定时任务调度方法,其特征在于,步骤4具体包括:
步骤4.1:调度中心实例化一个RpcReferenceBean实例,此实例是RPC调用方法的应用类,用于包装RPC服务,进行消息的放松和接收,通过此实例初始化一个netty_http服务端和客户端;
步骤4.2:实例化一个RpcRequest实例,此实例包装RPC的消息请求发送服务,调用步骤4.1中的netty_http服务端的asyncSend方法,将RPC请求通过异步发送的方式,发送给任务客户端,并获得具体任务的请求结果;
步骤4.3:RPC消息实例通过getPool方法,从步骤4.1中实例的RpcReferenceBean中初始化的netty_http中获取客户端的连接池;
步骤4.4:通过连接池获取netty_http客户端服务连接,调用其send方法发送任务调度请求,由任务客户端接收任务请求并处理具体任务;
步骤4.5:发送请求时使用对象封装调度请求参数和响应数据,在进行通讯之前底层会将上述两个对象序列化,并进行数据协议以及时间戳检验,达到数据加密的功能;
步骤4.6:netty_http客户端会尝试与数据库记录的所有执行器进行消息通信,当收到500的响应码时,自动转移请求到下一个任务执行器,直到有任务执行器返回200响应码,发送实际定时任务id到第一个检测为存活状态的任务执行中。
6.根据权利要求1所述的一种基于RPC及线程锁的分布式定时任务调度方法,其特征在于,步骤5具体包括:
步骤5.1:执行器在收到调度中心的请求后,采取实例化JobSpringExecutor类的手段,此类是在应用的Spring容器中注入任务执行器实例,对其start方法进行调用,start方法可以启用实例的初始化方法,使此实例进行初始化;
步骤5.2:在start方法中,采用通过配置的ip,port,appName初始化RpcProviderFactory,此类会生成一个RPC的服务提供产品工程,对ExecutorBizImpl这个执行类进行添加,此执行类会处理RPC服务中具体的请求发送和应答接收的事务;
步骤5.3:采取使用一个守护线程启动netty的http服务端的手段,对netty服务端中的channelRead方法进行执行,此方法可以获取服务端的连接管道,通过管道对任务的服务端进行请求发送;
步骤5.4:采取通过请求过来的类名作为key获取对应的serviceBean的手段,通过反射调用,对ExecutorBizImpl的run方法去执行,此方法会去执行具体的任务线程;
步骤5.5:采取获取定时任务id的手段,对JobThread线程进行实例化并进行调用,JobThread为任务线程实例,作业处理程序的具体实现逻辑包装在此实例中;
步骤5.6:执行对应的handler.execute,此方法将其放进触发器队列中,执行具体作业处理程序的处理逻辑,当作业程序处理成功,返回ReturnT.SUCCESS执行完成。
7.根据权利要求1所述的一种基于RPC及线程锁的分布式定时任务调度方法,其特征在于,步骤6具体包括:
步骤6.1:每次调度请求生成一个单独的日志文件,通过log打印执行日志;
步骤6.2:调度中心会加载对应的日志文件,可查看对应的执行日志;
步骤6.3:日志文件的存放位置可在执行器配置文件进行自定义;
步骤6.4:在日志中打印任务ID和任务执行器名称,方便日志追踪。
CN202010615472.3A 2020-06-25 2020-06-25 一种基于rpc及线程锁的分布式定时任务调度方法 Active CN111752696B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010615472.3A CN111752696B (zh) 2020-06-25 2020-06-25 一种基于rpc及线程锁的分布式定时任务调度方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010615472.3A CN111752696B (zh) 2020-06-25 2020-06-25 一种基于rpc及线程锁的分布式定时任务调度方法

Publications (2)

Publication Number Publication Date
CN111752696A CN111752696A (zh) 2020-10-09
CN111752696B true CN111752696B (zh) 2023-09-12

Family

ID=72678424

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010615472.3A Active CN111752696B (zh) 2020-06-25 2020-06-25 一种基于rpc及线程锁的分布式定时任务调度方法

Country Status (1)

Country Link
CN (1) CN111752696B (zh)

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112346837A (zh) * 2020-10-28 2021-02-09 常州微亿智造科技有限公司 一种工业物联网下分布式定时器系统
CN114615308A (zh) * 2020-12-03 2022-06-10 亚信科技(中国)有限公司 基于rpc的异步多线程并发网络通讯方法及装置
CN112835690B (zh) * 2021-04-07 2024-04-05 北京航天云路有限公司 一种可编排流程的定时作业执行的方法
CN113312386B (zh) * 2021-05-10 2022-06-24 四川新网银行股份有限公司 一种基于分布式消息的批量入库方法
CN113535362B (zh) * 2021-07-26 2023-07-28 北京计算机技术及应用研究所 一种分布式调度系统架构和微服务工作流调度方法
CN113742063A (zh) * 2021-08-06 2021-12-03 天津中新智冠信息技术有限公司 分布式定时调度系统和方法

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6081665A (en) * 1997-12-19 2000-06-27 Newmonics Inc. Method for efficient soft real-time execution of portable byte code computer programs
CN105335516A (zh) * 2015-11-04 2016-02-17 浪潮软件集团有限公司 一种通用采集系统的构建方法
CN105550028A (zh) * 2015-12-25 2016-05-04 Tcl集团股份有限公司 一种基于缓存锁的多任务时序执行方法及系统
CN109558234A (zh) * 2018-11-30 2019-04-02 中国联合网络通信集团有限公司 一种定时任务调度方法和装置
CN110032424A (zh) * 2019-01-28 2019-07-19 阿里巴巴集团控股有限公司 分布式锁的实现方法和装置
CN110445864A (zh) * 2019-08-11 2019-11-12 西藏宁算科技集团有限公司 一种云计算环境下分布式锁的实现方法及系统

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8332443B2 (en) * 2008-12-19 2012-12-11 Microsoft Corporation Masterless distributed batch scheduling engine

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6081665A (en) * 1997-12-19 2000-06-27 Newmonics Inc. Method for efficient soft real-time execution of portable byte code computer programs
CN105335516A (zh) * 2015-11-04 2016-02-17 浪潮软件集团有限公司 一种通用采集系统的构建方法
CN105550028A (zh) * 2015-12-25 2016-05-04 Tcl集团股份有限公司 一种基于缓存锁的多任务时序执行方法及系统
CN109558234A (zh) * 2018-11-30 2019-04-02 中国联合网络通信集团有限公司 一种定时任务调度方法和装置
CN110032424A (zh) * 2019-01-28 2019-07-19 阿里巴巴集团控股有限公司 分布式锁的实现方法和装置
CN110445864A (zh) * 2019-08-11 2019-11-12 西藏宁算科技集团有限公司 一种云计算环境下分布式锁的实现方法及系统

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
基于ARM的电能数据采集终端的设计;鲍建新;陈国平;忻尚芝;薛吉;;农业装备与车辆工程(第02期);64-67 *

Also Published As

Publication number Publication date
CN111752696A (zh) 2020-10-09

Similar Documents

Publication Publication Date Title
CN111752696B (zh) 一种基于rpc及线程锁的分布式定时任务调度方法
US20220070122A1 (en) Method and Apparatus for Composite User Interface Generation
Guerraoui et al. Software-based replication for fault tolerance
EP1696611B1 (en) Server data queuing system and method
US5659682A (en) Scheme to determine completion of directory operations for server recovery
US6260077B1 (en) Method, apparatus and program product for interfacing a multi-threaded, client-based API to a single-threaded, server-based API
CN107590072B (zh) 一种应用开发和测试的方法和装置
US6718489B1 (en) Electronic service request generator for automatic fault management system
US20020161859A1 (en) Workflow engine and system
US8407723B2 (en) JAVA virtual machine having integrated transaction management system and facility to query managed objects
US8782666B2 (en) Methods and platforms for highly available execution of component software
US20030187927A1 (en) Clustering infrastructure system and method
US7165097B1 (en) System for distributed error reporting and user interaction
US20050278706A1 (en) System, method, and computer program product for logging diagnostic information
CN102207859A (zh) 解决方案部署方法、设备和系统
Tripathi et al. Exception handling in agent-oriented systems
US20070094675A1 (en) Object mobility
US7526519B2 (en) High availability application view deployment
US20100042875A1 (en) Capturing machine state of unstable java program
CN113190371B (zh) 一种任务补偿方法、装置、电子设备及可读存储介质
US7562369B1 (en) Method and system for dynamic configuration of activators in a client-server environment
Kalbarczyk et al. Application fault tolerance with Armor middleware
Zhao Design and implementation of a Byzantine fault tolerance framework for Web services
Chen et al. A framework for robust HLA-based distributed simulations
Kim et al. Software fault tolerance for distributed object based computing

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
GR01 Patent grant
GR01 Patent grant