您好!欢迎来到爱源码

爱源码

热门搜索: 抖音快手短视频下载   

SpringBoot集成Quartz实现JAVA调度任务的动态配置 《网站源码》

  • 时间:2022-09-09 11:04 编辑: 来源: 阅读:299
  • 扫一扫,手机访问
摘要:SpringBoot集成Quartz实现JAVA调度任务的动态配置 《网站源码》
什么是动态配置的计划任务?首先说一下这个主题,动态配置。 没有接触过定时任务的同学可以先看看这篇文章:JAVA中实现定时任务的几种方法。实现定时任务的方法有千万种,但基本的不外乎1种。JDK的定时器类2,石英3和SpringTask。 这三种制作方法我都用过。 然而,最常用的方法是xml配置,这是最简单、无代码且易于理解的方法。 但是有一个致命的缺点,比如你要改变一个任务的触发时间,或者你要增加一个新任务,暂停一个任务。 怎么做?停止应用程序!更改XML配置!重启!致命吗? 最近重新研究了石英的配置,实现了不停机添加、暂停、删除、立即触发任务的方法。在这篇文章中,它实际上不是一个完整的研究。上一个公司已经实施了,这次是基于对大老板的理解重新实施。 国际惯例~先看效果图管理界面:image.png效果图:真的不知道要运行什么,所以每十秒钟调用一次。 maven在image.png的实现依靠springboot作为框架支撑。 & lt!-石英->;& lt依赖性& gt& ltgroupId & gtorg . quartz-scheduler & lt;/groupId & gt;& ltartifactId & gt石英& lt/artifact id & gt;& lt版本& gt2 . 2 . 1 & lt;/version & gt;& lt/dependency & gt;& lt依赖性& gt& ltgroupId & gtorg.springframework & lt/groupId & gt;& ltartifactId & gtspring-context-support/artifact id & gt;& lt/dependency & gt;记录表 create ` sys _ task `( ` id ` bigint(20)not null auto _ increment,` job _ name ` varchar(255)default null comment ' task name '),` description ` varchar(255)default null comment ` cron expression ',` bean _ class ` varchar(255)default null comment '方法包名+任务执行时调用的类的类名,` job _ status` varchar (255 ` job _ group` varchar (255)默认空注释'任务分组',` create _ user` varchar (64)默认空注释'创建者',` create _ time` datetime默认空注释'创建时间',` update _ user` varchar (64)默认空注释'升级者',` update _ time` datetime默认空注释'升级时间',主键(` id `))engine = myisam auto _ increment = 32 defaultcharset = utf8; 实施步骤 启动项目,启动任务监控读取数据库,将打开的任务job和trigger加载到调度器中,根据任务调度运行job类,每次运行时用AdaptableJobFactory实例化job类,注入要运行的服务。是不是听起来很简单,但是我还是很迷茫,且听我慢慢道来~ ~代码逻辑 步骤1:启动项目并加载监视器。 石英配置跳靴的配置方法。对于常规的Spring项目,@ configuration public class Quartz configuration { @ autowired private job factory job factory;@ Bean public SchedulerFactoryBean SchedulerFactoryBean(){ SchedulerFactoryBean SchedulerFactoryBean = new SchedulerFactoryBean();请尝试{ schedulerfactorybean . setoverwriteexistingjobs(true);schedulerfactorybean . setquartz properties(quartz properties());schedulerfactorybean . setjobfactory(job factory);} catch(Exception e){ e . printstacktrace();}返回schedulerFactoryBean}//指定quartz.properties,以及相关属性@ bean公共属性quartz properties()ThrowsioException { propertiesforybean propertiesforybean = New propertiesforybean();propertiesfactorybean . set location(new class path resource("/config/quartz . properties "));propertiesforybean . afterpropertiesset();返回propertiesforybean . getobject();}//Create schedule @ bean(name = " scheduler ")public scheduler(){ return schedulerfactorybean()。get scheduler();}}听众 @Component@Order(value = 1)公共类ScheduleJobInitListener实现command line runner { @ Autowired task service scheduleJobService;@覆盖公共void运行(字符串...arg0)引发异常{ try { schedulejobservice . init schedule();} catch(Exception e){ e . printstacktrace();} }}CommandLineRunner类似于Spring框架的ApplicationListener监听器。 官方的解释是:用于指示bean包含在spring应用程序中时应该运行的接口。可以定义多个命令行运行程序beans。并且可以使用ordered接口或order @ order注释进行排序。当接口被添加到spring容器时,它被用作run方法来执行它。 多个CommandLineRunner可以同时在同一个spring上下文中执行,执行顺序与order注释的参数顺序一致。 步骤2:读取数据库并加载调度程序。 分批法 @ override public void init schedule()抛出调度程序异常{//获取任务信息数据列表& lt here < TaskDO & gtjob list = task mapper . list();for(task do task:job list){ if(JobStatusEnum。RUNNING.getCode()。equals(task . getjobstatus()){ quartz manager . add job(task);}}}向Quartz调度程序添加任务 /* * * Add a task/@ suppress warnings(" unchecked ")public void Add Job(task do task){ try {//创建jobDetail的实例,绑定Job实现类//指明作业的名称、所属组的名称以及绑定的job class class <?扩展作业& gtjob Class =(Class & lt;?扩展作业& gt)(class . forname(task . getbean class())。newInstance()。getClass());job detail job detail = job builder . new job(job class)。With Identity (task.getjobname()、Task . getjobgroup())//任务名称和组构成任务关键字。build();//定义调度触发规则//使用cornTrigger规则trigger = trigger builder . new trigger()。With identity (task.getjobname()、task . getjobgroup())//trigger key . startat(date builder . future date(1,IntervalUnit。第二)。with schedule(cronschedulebuilder . cron schedule(task . getcron expression()))。startNow()。build();//在任务调度中向scheduler . schedule job(job detail,trigger)注册作业和触发器;//start if(!scheduler . isshutdown()){ scheduler . start();} } catch(异常e){ e . printstacktrace();} }调度器作为Quartz的核心调度器,拥有近50个API接口,包括添加、暂停、恢复、删除任务等一系列API。这里只详细介绍几种常用的。如果想了解更多,可以稍后再看彩蛋板块。 Start()方法:只有在调用start()方法后,调度器线程才开始启动触发器并运行jobpauseJob(JobKey jobKey):根据指定的JobDetail键暂停作业。 ResumeJob(JobKey jobKey):根据指定的键恢复作业。 DeleteJob(JobKey jobKey):删除一个jobtriggerJob(JobKey jobKey):触发一个JobDetail(立即执行) 重排作业(触发器键触发器键,触发新触发器):删除具有给定键的触发器,并存储新触发器,新触发器必须与同一作业相关联(新触发器必须具有指定的作业名和组)-但是,新触发器不必与旧触发器同名。 步骤3:根据任务调度运行作业类。 其实我们不需要写这一步。在我们将正确的JobDetail和触发器表达式加载到任务调度中之后,调度器将自动触发任务的执行。 步骤4:实例化作业类并注入要运行的服务。 Class @ component公共类jobfactory扩展adaptable job factory {//这个对象Spring会帮我们自动注入,也属于Spring技术的范畴。//为什么需要这个类?在我写的这个演示中,你可以删除这个类,发现程序可以正确运行,但是为什么我还要添加它? //大家可以看看我们的任务类,可以看到作业对象的实例化过程是在Quartz中进行的。这个时候如果我们注入spring的东西肯定不行,所以我们需要这个类@ autowired private autowired capblebeanfactory capable bean factory;@ Override Protected Object Create Job Instance(触发器触发的Bundle Bundle)throws exception {//调用父类的方法Object Job Instance = super。创建作业实例(捆绑包);//注入capablebeanfactory . autowirebean(job instance);返回jobInstance}}任务类 @ disallow concurrency execution//job不并发@ component public class hello world job implements job { @ override public void execute(jobexecutioncontext arg 0)Throws JobExecutionException { system . out . println("欢迎来到yyblog,这是一个定时任务——小店的爷爷!"+Date utils . full time(new Date()));}}好了,大功告成。简单的动态配置计时任务已经完成。 没那么容易。让我们简单地实现其他常见的API。 暂停作业。 public void pauseJob(TaskDO task)抛出schedule exception { job key job key = job key . job key(task . getjobname()、task . getjobgroup());scheduler . pause job(job key);} recover a job public void resume job(task do task)抛出调度程序异常{ job key job key = job key . job key(task . getjobname()、task . getjobgroup());scheduler . resume job(job key);} Delete a job public void Delete job(task do task)抛出调度程序异常{ job key job key = job key . job key(task . getjobname()、task . getjobgroup());scheduler . delete job(job key);}立即触发job public void runjobnow(task do task)抛出调度程序异常{ job key job key = job key . job key(task . getjobname()、task . getjobgroup());scheduler . trigger job(job key);}升级作业表达式public void updatejobcron(task do task)抛出调度程序异常{ trigger key trigger key = trigger key。触发键(task.getjobname()、task . getjobgroup());cron trigger trigger =(cron trigger)scheduler . get trigger(trigger key);CronScheduleBuilder schedule builder = CronScheduleBuilder . cron schedule(task . getcron expression());trigger = trigger . gettriggerbuilder()。withIdentity(triggerKey)。withSchedule(scheduleBuilder)。build();scheduler . reschedule job(trigger key,trigger);}总结主体到此为止。不废话了。本文没有太多的解释原理,只是一个简单的应用。


  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【技术支持|常见问题】1556原创ng8文章搜索页面不齐(2024-05-01 14:43)
【技术支持|常见问题】1502企业站群-多域名跳转-多模板切换(2024-04-09 12:19)
【技术支持|常见问题】1126完美滑屏版视频只能显示10个(2024-03-29 13:37)
【技术支持|常见问题】响应式自适应代码(2024-03-24 14:23)
【技术支持|常见问题】1126完美滑屏版百度未授权使用地图api怎么办(2024-03-15 07:21)
【技术支持|常见问题】如何集成阿里通信短信接口(2024-02-19 21:48)
【技术支持|常见问题】算命网微信支付宝产品名称年份在哪修改?风水姻缘合婚配对_公司起名占卜八字算命算财运查吉凶源码(2024-01-07 12:27)
【域名/主机/服务器|】帝国CMS安装(2023-08-20 11:31)
【技术支持|常见问题】通过HTTPs测试Mozilla DNS {免费源码}(2022-11-04 10:37)
【技术支持|常见问题】别告诉我你没看过邰方这两则有思想的创意广告! (2022-11-04 10:37)

联系我们
Q Q:375457086
Q Q:526665408
电话:0755-84666665
微信:15999668636
联系客服
企业客服1 企业客服2 联系客服
86-755-84666665
手机版
手机版
扫一扫进手机版
返回顶部