1.一种分布式动态定时任务调度方法,其特征在于:包括如下步骤:
步骤1,启动系统,对当前系统每个实例的注册,然后将启动状态下的任务分布到不同的实例上;
步骤2:创建并启动定时任务
首先在前端web界面配置任务的基本信息,基础信息包括任务名称、任务的简单描述和调度任务类型;任务配置完毕后保存,此时前端会调用后端接口创建任务,接口通过对应的负载均衡策略将创建的任务负载到对应的实例上,任务启动完成后,将任务相关的信息持久化保存到数据库中的task_info表中;
步骤3:任务的修改
任务的修改包括周期任务的启动、停止与调度周期的修改,用户在前端界面做出修改后,点击修改按钮会通过消息总线发出一条任务被修改的消息,并将该消息发送给后端的每一个实例上,实例收到消息后,根据消息类型做出以下动作;
如果是启动任务的消息,按照步骤2中的逻辑,将任务运行到某个实例上;
如果是停止任务的消息,首先查询该实例的任务调度队列是否存在对应的任务,如果没有,对应的任务则不做处理,如果有,对应的任务首先从该实例的任务调度队列中取出对应的任务,将其删除,并修改数据库中task_info表的状态为停止状态;
如果是任务的调度周期发生改变,首先判断该任务是否运行在当前实例上,如果不在该实例不做任务处理,如果在则首先从该例任务调度队列中取出该任务,基于新的调度方案重新注册任务,将其重新加到任务调度队列中,并修改task_info表中任务的对应信息;
步骤4:任务的监控
任务每次运行后,将任务的运行过程中产生的信息以及最终的结果,写入到monitor_info表中。
2.根据权利要求1中所述的分布式动态定时任务调度方法,其特征在于:在步骤1中,对每个实例进行注册时,将实例所运行的机器信息存入数据库中的service_info表中,机器信息包括主机名、ip地址和该实例是否已经启动完成;service_info表相当于服务的注册中心;启动后系统中每个实例会循环等待是否所有的实例都已经完成上述注册操作,如果没有则循环等待,直到所有的实例都已经完成注册信息后,然后开始将处于启动状态的任务分发到不同的运行实例上。
3.根据权利要求2中所述的分布式动态定时任务调度方法,其特征在于:在步骤1中,在任务分布到不同的实例的过程中,首先对所有的实例进行按主机名排序后进行编号,然后读取task_info表加载所有的处于调度状态的任务,根据轮训算法,将任务依次分发到不同的实例上,然后在每个实例上启动对应的调度。
4.根据权利要求1中所述的分布式动态定时任务调度方法,其特征在于:在步骤2中,所述任务类型包括周期型的任务、单次任务和单次定时任务;
后端服务收到创建任务的请求后,便会启动对应的任务;根据不同的任务类型,启动任务的流程会有不同的逻辑;
对于是期型的任务,根据配置的调度周期生成定时任务通用的cron表达式,组装任务信息,通过Spring框架ScheduledTaskRegistrar类提供的方法将注册相关任务得到ScheduledFuture对象,然后将其放到任务调度的队列中,等到达指定时间便开始执行任务;
对于单次任务逻辑,直接新建一个线程执行对应的逻辑;
对于单次定时任务,借助与java的Timer类与TimerTask对象来实现指定时间启动对应的执行线程。