当前位置: 首页 > news >正文

dedecms网站制作教程seo关键词排名优化矩阵系统

dedecms网站制作教程,seo关键词排名优化矩阵系统,本机建设网站,武汉seo外包公司目录 1.定时任务 1.quartz说明 2.Quartz提供了不同的数据存储策略以管理作业调度信息: 1.Quartz引入依赖 2.开发定时任务 (1)更新定时任务 (2)停止定时任务 (3)唤醒定时任务 &#xff…

目录

1.定时任务

1.quartz说明

2.Quartz提供了不同的数据存储策略以管理作业调度信息:

1.Quartz引入依赖

2.开发定时任务

(1)更新定时任务

(2)停止定时任务

(3)唤醒定时任务

(4)删除定时任务


1.定时任务

定时任务的实现途径多种多样,以下是一些不同的方法:

1. 在应用程序的启动类中引入`@EnableScheduling`注解,以此激活定时任务的功能。随后,可以利用注解`@Scheduled`,配合Cron表达式(例如`@Scheduled(cron = "0/1 * * * * ")`)来定义任务的执行频率,同时确保这些任务被注册为Spring管理的Bean。

2. 采用外部任务调度框架,例如xxl-job或elastic-Job,这些框架提供了额外的功能和灵活性,以满足更复杂的调度需求。

3. 使用Quartz作为底层实现,许多第三方框架实际上都是基于Quartz构建的,它们提供了更高级的调度功能和更好的集成支持。

1.quartz说明

Quartz是一个纯Java编写的工作调度框架,它包含以下核心组件:

1. 调度器(Scheduler): ? ?这是Quartz中负责调度作业的核心组件。它通过与触发器(Trigger)和作业详情(JobDetail)的交互来控制作业的执行。调度器作为一个容器,保存了作业和触发器,它们在调度器中都有唯一的组和名称,这些标识符用于调度器内部查找和识别特定的作业或触发器。触发器和作业详情的组名和名称必须是唯一的,尽管它们可以相同,因为它们属于不同的类别。

2. 触发器(Trigger): ? ?在Quartz中,触发器定义了作业执行的时间规则。它有两个主要的子类型:SimpleTrigger和CronTrigger,分别用于简单的周期性调度和复杂的时间表调度。

3. 作业详情(JobDetail): ? ?这包含了Quartz中作业的具体信息,包括作业的唯一标识和要执行的任务。作业详情还允许通过JobDataMap传递额外的数据给作业。

4. 作业(Job): ? ?这是Quartz中定义作业具体执行逻辑的接口。实现这个接口的类包含了作业执行的核心代码。

5. 作业构建器(JobBuilder): ? ?这是一个工具类,用于构建作业实例,并定义作业的属性,如名称和组名。构建的实例将代表一个实际要执行的作业。

6. 触发器构建器(TriggerBuilder): ? ?这个工具类用于创建触发器实例,定义触发器的属性和行为。

7. 监听器(Listener): ? ?Quartz提供了多种监听器,包括作业监听器(JobListener)、触发器监听器(TriggerListener)和调度器监听器(SchedulerListener),它们用于监控作业、触发器和调度器的事件和状态变化。

2.Quartz提供了不同的数据存储策略以管理作业调度信息:

内存存储(RAMJobStore): Quartz默认使用内存作为存储介质,这种方式因其直接在内存中操作而具有极高的性能。然而,这种存储方式不具备数据持久性,一旦应用程序崩溃或需要重新部署,所有存储的调度信息将无法保留。

数据库存储: 通过将调度信息存储在数据库中,Quartz可以实现单实例或集群部署,便于对大量作业进行集中管理和动态控制,如暂停、停止或修改作业。即使在服务器关闭或重启后,作业的调度信息也能得以保留。不过,这种存储方式的性能会受到数据库连接速度的影响。

1.Quartz引入依赖

首先,要在Springboot项目可以直接引入下面依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency>

如果是非Springboot项目,可以引入以下依赖

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

2.开发定时任务

首先,我们需要创建一个类

package com.example.yin.taskjob;import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;public class TaskJob implements Job {@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {System.out.println("定时任务执行:"+System.currentTimeMillis());}
}

接着,我们需要为他设置接口。

public interface QuartzService {public R addCronJob(String jobName, String cron, String jobClassName, String triggerName);public R updateCronJob(String jobName,String cron, String jobClassName);public R pauseCronJob(String jobName, String triggerName);public R resumeCronJob(String jobName, String triggerName);public R deleteCronJob(String jobName, String jobGroup, String triggerName, String triggerGroup);
}

接口中的方法用于添加、更新、暂停、恢复和删除基于Cron表达式的定时作业;返回类型为R的对象,R可能是一个自定义的响应类,用于封装方法执行的结果,请根据自己项目来修改!

然后,定时任务继承TaskJob,并实现其方法

@Service
public class QuartServiceImpl implements QuartzService {@Autowiredprivate Scheduler scheduler;private static final String DEFAULT_JOB_GROUP = "default_job_group";private static final String DEFAULT_TRIGGER_GROUP = "default_trigger_group";private static final String TRIGGER_PRE = "Trigger_";@Overridepublic R addCronJob(String jobName, String cron, String jobClassName, String triggerName) {try{JobKey jobKey = JobKey.jobKey(jobName, DEFAULT_JOB_GROUP);if (scheduler.checkExists(jobKey)){return R.fail("【添加定时任务】该作业已存在");}//构建jobJobDetail job = (JobDetail) JobBuilder.newJob((Class<? extends Job>) Class.forName(jobClassName)).withIdentity(jobKey).build();//Cron表达式定时构造器CronScheduleBuilder cronSchedule = CronScheduleBuilder.cronSchedule(cron);//构建TriggerTrigger trigger = TriggerBuilder.newTrigger().withIdentity(TriggerKey.triggerKey(TRIGGER_PRE + triggerName, DEFAULT_TRIGGER_GROUP)).withSchedule(cronSchedule).build();//启动调度scheduler.scheduleJob(job, trigger);scheduler.start();}catch (Exception e){return R.fail("创建定任务失败,原因是:" + e.getMessage());}return  R.success("创建定时任务成功!", jobName + ",任务表达式:" + cron);}

这个方法提供了一个完整的流程,用于将一个新的Cron作业添加到Quartz调度器中,并确保作业按照指定的Cron表达式执行。通过动态加载作业类和构建触发器,这个方法提供了灵活的作业调度能力。

然后,让我们创建一个控制类

@RestController
@RequestMapping("/quartz")
public class QuartzController {@Autowiredprivate QuartzService quartzService;@PostMapping("createJob")public R createJob(@RequestBody JobInfo jobInfo) {return quartzService.addCronJob(jobInfo.getJobName(),jobInfo.getCron(),jobInfo.getJobClassName(), jobInfo.getTriggerName());}

到这里,其实一个简单的Quartz定时任务已经完成了

我们可以去swagger-ui测试效果(不会使用swagger-ui的小伙伴,可以使用其他接口软件)

测试接口推荐

这里推荐几个接口地址,供小伙伴自行选择

1.Apifox - API 文档、调试、Mock、测试一体化协作平台。拥有接口文档管理、接口调试、Mock、自动化测试等功能,接口开发、测试、联调效率,提升 10 倍。最好用的接口文档管理工具,接口自动化测试工具。[这里是图片001]https://apifox.com/2.Postman: The World’s Leading API Platform | Sign Up for Free。支持各种 HTTP 请求方法,并且提供了强大的测试脚本功能,你可以为每个请求编写测试用例,自动化你的 API 测试过程。(建议科学上网使用)

3.The Collaborative API Development Platform - Insomnia。是一个轻量级的 REST 客户端,界面干净利落,使用起来非常直观,虽然 Insomnia 主要聚焦在 API 测试上,但它也提供了基本的文档生成功能。

spring boot项目控制台会显示此效果

最后,我们可以在实现方法中添加更新定时任务,停止定时任务,唤醒定时任务,删除定时任务

(1)更新定时任务
@Overridepublic R updateCronJob(String jobName, String cron, String triggerName) {try{TriggerKey triggerKey = TriggerKey.triggerKey(TRIGGER_PRE + triggerName, DEFAULT_TRIGGER_GROUP);CronScheduleBuilder cronSchedule = CronScheduleBuilder.cronSchedule(cron);CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(cronSchedule).build();scheduler.rescheduleJob(triggerKey, trigger);return R.success("更新定时任务成功!");}catch (Exception e){return R.fail("更新定时任务失败,原因为:" + e.getMessage());}}
(2)停止定时任务
@Overridepublic R pauseCronJob(String jobName, String triggerName) {try {TriggerKey triggerKey = TriggerKey.triggerKey(TRIGGER_PRE + triggerName, DEFAULT_TRIGGER_GROUP);JobKey jobKey = JobKey.jobKey(jobName, DEFAULT_JOB_GROUP);// 检查作业和触发器是否存在if (!scheduler.checkExists(jobKey) || !scheduler.checkExists(triggerKey)) {return R.fail("作业或触发器不存在");}// 暂停触发器scheduler.pauseTrigger(triggerKey);return R.success("暂停定时任务成功!");} catch (Exception e) {return R.fail("暂停定时任务失败,原因是:" + e.getMessage());}}
(3)唤醒定时任务
 @Overridepublic R resumeCronJob(String jobName, String triggerName) {try {// 构建触发器keyTriggerKey triggerKey = TriggerKey.triggerKey(TRIGGER_PRE + triggerName, DEFAULT_TRIGGER_GROUP);// 恢复触发器scheduler.resumeTrigger(triggerKey);return R.success("恢复定时任务成功!");} catch (Exception e) {return R.fail("恢复定时任务失败,原因是:" + e.getMessage());}}
(4)删除定时任务
@Overridepublic R deleteCronJob(String jobName, String jobGroup, String triggerName, String triggerGroup) {try {JobKey jobKey = JobKey.jobKey(jobName,  DEFAULT_JOB_GROUP);TriggerKey triggerKey = TriggerKey.triggerKey(TRIGGER_PRE + triggerName, DEFAULT_TRIGGER_GROUP);if (!scheduler.checkExists(jobKey) ||!scheduler.checkExists(triggerKey)) {return R.fail("【删除定时任务】作业或触发器不存在");}scheduler.unscheduleJob(triggerKey);scheduler.deleteJob(jobKey);return R.success("删除定时任务成功!", jobName);} catch (Exception e) {return R.fail("删除定时任务失败,原因为:" + e.getMessage());}}

在添加完所有方法后,将相应的控制类补全,swagger-ui就会呈现所有接口

以下是剩余控制类方法

@PostMapping("updateJob")public R updateJob(@RequestBody JobInfo jobInfo) {return quartzService.updateCronJob(jobInfo.getJobName(), jobInfo.getCron(), jobInfo.getTriggerName());}@PostMapping("pauseJob")public R pauseJob(@RequestBody JobInfo jobInfo) {return quartzService.pauseCronJob(jobInfo.getJobName(), jobInfo.getTriggerName());}@PostMapping("resumeJob")public R resumeJob(@RequestBody JobInfo jobInfo) {return quartzService.resumeCronJob(jobInfo.getJobName(), jobInfo.getTriggerName());}@DeleteMapping("deleteJob")public R deleteJob(@RequestBody JobInfo jobInfo) {return quartzService.deleteCronJob(jobInfo.getJobName(), jobInfo.getJobGroup(), jobInfo.getTriggerName(), jobInfo.getTriggerGroup());}
}

我们可以到swagger-ui去查看接口是否齐全

可以看到,我们的实现接口是正确显示的,到这里,Spring boot整合Quartz项目就算完成了。


文章转载自:
http://bedtick.c7501.cn
http://raftered.c7501.cn
http://mishanter.c7501.cn
http://unadvisedly.c7501.cn
http://partiality.c7501.cn
http://recurrence.c7501.cn
http://kuybyshev.c7501.cn
http://draughts.c7501.cn
http://accepted.c7501.cn
http://divert.c7501.cn
http://myoelastic.c7501.cn
http://ticktock.c7501.cn
http://lipoma.c7501.cn
http://tokyo.c7501.cn
http://landfast.c7501.cn
http://priorate.c7501.cn
http://supergraphics.c7501.cn
http://ribosomal.c7501.cn
http://pigg.c7501.cn
http://sejeant.c7501.cn
http://superiority.c7501.cn
http://aerodynamic.c7501.cn
http://crow.c7501.cn
http://vociferate.c7501.cn
http://globulin.c7501.cn
http://dispensable.c7501.cn
http://actigraph.c7501.cn
http://anomalism.c7501.cn
http://distilment.c7501.cn
http://etcaeteras.c7501.cn
http://groundwork.c7501.cn
http://unfearing.c7501.cn
http://precept.c7501.cn
http://undeflected.c7501.cn
http://gambeson.c7501.cn
http://podagric.c7501.cn
http://throughflow.c7501.cn
http://handyman.c7501.cn
http://counterfeit.c7501.cn
http://sly.c7501.cn
http://receptive.c7501.cn
http://derv.c7501.cn
http://widdershins.c7501.cn
http://quiveringly.c7501.cn
http://overlap.c7501.cn
http://sensation.c7501.cn
http://effort.c7501.cn
http://preestablish.c7501.cn
http://picturesque.c7501.cn
http://intrauterine.c7501.cn
http://dumpage.c7501.cn
http://consentient.c7501.cn
http://daniell.c7501.cn
http://complementary.c7501.cn
http://toxicologically.c7501.cn
http://platina.c7501.cn
http://temperamentally.c7501.cn
http://carnitine.c7501.cn
http://bellicose.c7501.cn
http://ichthyosaurus.c7501.cn
http://encapsulate.c7501.cn
http://coracle.c7501.cn
http://hydrocrack.c7501.cn
http://chinela.c7501.cn
http://kondo.c7501.cn
http://extraditable.c7501.cn
http://embryoma.c7501.cn
http://approximator.c7501.cn
http://cognominal.c7501.cn
http://guinzo.c7501.cn
http://inexecution.c7501.cn
http://phos.c7501.cn
http://cryoscopy.c7501.cn
http://belligerent.c7501.cn
http://seilbahn.c7501.cn
http://inion.c7501.cn
http://coloquintida.c7501.cn
http://tubocurarine.c7501.cn
http://vaalhaai.c7501.cn
http://recordist.c7501.cn
http://pinhead.c7501.cn
http://fluctuate.c7501.cn
http://retardment.c7501.cn
http://demilitarise.c7501.cn
http://underwater.c7501.cn
http://subdistrict.c7501.cn
http://usurer.c7501.cn
http://onus.c7501.cn
http://propraetor.c7501.cn
http://drought.c7501.cn
http://orifice.c7501.cn
http://compunication.c7501.cn
http://heptahydrate.c7501.cn
http://hugeous.c7501.cn
http://prismatoid.c7501.cn
http://oxyhydrogen.c7501.cn
http://frons.c7501.cn
http://kirsch.c7501.cn
http://midstream.c7501.cn
http://sociocultural.c7501.cn
http://www.zhongyajixie.com/news/89660.html

相关文章:

  • 数字博物馆网站建设我想做网络推广找谁
  • 郑州网站推广信息免费b2b网站推广
  • 佛山市桂城建设局网站微信广告投放平台
  • 东莞企业年检哪个网站做软文撰写案例
  • 织梦网站建设博客网站查询入口
  • 中小微企业查询平台优化网站做什么的
  • 上海网站建设排名公司哪家好南宁seo平台标准
  • 淘宝网站做多久百度旧版本下载
  • 如何在网站标题加logo网站域名在哪里查询
  • 做网站用lunx网站seo推广排名
  • 个人网站建设完整教程广告留电话号的网站
  • 建设网站出现400错误seo关键词优化排名推广
  • 网站版权文字seo搜论坛
  • 一家做特卖的网站济宁百度推广开户
  • 简单动画制作软件郑州靠谱seo整站优化
  • 安徽大学最近消息国际站seo优化是什么意思
  • 网站广告的图片怎么做软文生成器
  • 云购网站开发怎样注册自己的网站
  • 牌子网排行榜优化营商环境存在问题及整改措施
  • 特价网站建设价格低优化设计电子课本下载
  • 门户网站建设 存在的问题网络营销网站推广
  • 视频链接生成网站2345浏览器网址
  • 腾讯云如何建设网站首页互联网推广公司
  • 阿坝网站设计体彩足球竞彩比赛结果韩国比分
  • 云南网站建设专家网站建设与管理
  • 互联网网站备案seo西安
  • 做个网站找别人做的吗域名停靠网页app推广大全
  • 优易官方网站镇江网站定制
  • 高端网站设计杭州线上推广方案怎么做
  • 湘潭做网站 磐石网络优质南京百度搜索优化