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

建设网站公司专业服务网站建设在会计里算什么资产

建设网站公司专业服务,网站建设在会计里算什么资产,h5怎么弄到微信公众号,合肥做网站推广哪家好第一章 定时任务概述 在项目中开发定时任务应该一种比较常见的需求#xff0c;在 Java 中开发定时任务主要有三种解决方案#xff1a;一是使用JDK 自带的 Timer#xff0c;二是使用 Spring Task#xff0c;三是使用第三方组件 Quartz Timer 是 JDK 自带的定时任务工具,其…第一章 定时任务概述 在项目中开发定时任务应该一种比较常见的需求在 Java 中开发定时任务主要有三种解决方案一是使用JDK 自带的 Timer二是使用 Spring Task三是使用第三方组件 Quartz Timer 是 JDK 自带的定时任务工具,其简单易用但是对于复杂的定时规则无法满足在实际项目开发中也很少使用到。而 Spring Task使用起来很简单除 Spring 相关的包外不需要额外的包而且支持注解和配置文件两种形式。 Quartz 功能强大但是使用起来相对笨重。 建议 单体项目架构使用Spring Task 分布式项目架构使用Quartz 第二章 JDK实现任务调度 /*** 基于jdk的任务调度*/ public class JdkTaskDemo {public static void main(String[] args) {//创建定时类Timer timer new Timer();//创建任务类TimerTask task new TimerTask() {Overridepublic void run() {System.out.println(定时任务执行了...... LocalDateTime.now().format(DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss)));}};//执行定时任务timer.schedule(task,new Date(),2000);} } 第三章 Spring-task实现任务调度 3.1 节 Spring-task入门案例 【1】搭建SpringBoot工程导入spring-boot-starter-web即可不需导入任何其他依赖,pom如下 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.7.6/versionrelativePath/ !-- lookup parent from repository --/parentgroupIdtop.psjj/groupIdartifactIdtask-study/artifactIdversion0.0.1-SNAPSHOT/versionnametask-study/namedescriptiontask-study/descriptionpropertiesjava.version8/java.version/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/project 【2】编写启动类打开任务调度注解 package top.psjj;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling;SpringBootApplication EnableScheduling public class TaskStudyApplication {public static void main(String[] args) {SpringApplication.run(TaskStudyApplication.class, args);} } 【3】编写任务类测试 //创建测试任务类//放入容器中 Component public class SpringTask {//使用Scheduled 注解 配合 cron 表达式Scheduled(cron */1 * * * * *)public void task1() throws InterruptedException {System.out.println(Thread.currentThread().getName()task1--LocalDateTime.now());} } 3.2 节 Spring-task 分析 接下来我们编写任务调度可调度程序加一下执行时间模拟真实业务。 //创建测试任务类//放入容器中 Component public class SpringTask {//使用Scheduled 注解 配合 cron 表达式Scheduled(cron */1 * * * * *)public void task1() throws InterruptedException {System.out.println(Thread.currentThread().getName()task1--LocalDateTime.now());Thread.sleep(5000);} }任务并不是每秒执行一次而是六秒执行一次 得出结论 1.Spring-task 执行任务按照单线程执行并合理执行不会因为第一个执行任务时间过长而去执行第二个任务 2.Spring-task是单线程的处理任务处理任务能力有限不建议处理分布式架构的任务调度 比如说 Component public class MyTask {Scheduled(cron */1 * * * * *) //每秒执行1次public void task2() throws InterruptedException {System.out.println(Thread.currentThread().getName():task2--- LocalDateTime.now());}Scheduled(cron */1 * * * * *) //每秒执行1次public void task1() throws InterruptedException {System.out.println(Thread.currentThread().getName():task1--- LocalDateTime.now());Thread.sleep(5000);} } 定时任务2 1s时间执行完但受任务1影响也需要等5s。   3.3 节 Cron表达式讲解 关于 cronExpression 表达式有至少 6 个也可能是 7 个由空格分隔的时间元素。从左至右这些元素的定义如下 1秒0–59 2分钟0–59 3小时0–23 4月份中的日期1–31 5月份1–12 或 JAN–DEC 6星期中的日期1–7 或 SUN–SAT 7年份1970–2099 逗号为并列作用 0 0 10,14,16 * * ? 每天上午 10 点,下午 2 点和下午 4 点 - 是代表1到10天  0 0,15,30,45 * 1-10 * ? 每月前 10 天每隔 15 分钟 30 0 0 1 1 ? 2012 在 2012 年 1 月 1 日午夜过 30 秒时 各个时间可用值如下 秒 0-59 , - * / 分 0-59 , - * / 小时 0-23 , - * / 日 1-31 , - * ? / L W C 月 1-12 or JAN-DEC , - * / 周几 1-7 or SUN-SAT , - * ? / L C # 年(可选字段) empty, 1970-2099 , - * / 可用值详细分析如下 * —— 字符可以用于所有字段,在分字段中设为*表示每一分钟的含义。 ? —— 字符可以用在日和周几字段,它用来指定不明确的值。这在你需要指定这两个字段中的某一个值而不是另外一个的时候会被用到。在后面的例子中可以看到其含义。 - —— 字符被用来指定一个值的范。比如在小时字段中设为10-12表示10 点到 12 点。 , —— 字符指定数个值。比如在周几字段中设为MON,WED,FRI,表示the days Monday, Wednesday, and Friday。 / —— 字符用来指定一个值的的增加幅度。比如在秒字段中设置为0/15表示第 0, 15, 30,和 45 秒。而5/15则表示第 5, 20, 35,和 50。在/前加*字符相当于指定从 0 秒开始。每个字段都有一系列可以开始或结束的数值。对于秒和分字段来说其数值范围为 0 到 59。对于小时字段来说其为 0 到 23,对于“日”字段来说为 0 到 31。而对于月字段来说为 1 到 12。/字段仅仅只是帮助你在允许的数值范围内从开始第 n的值。 L —— 字符可用在日和周几这两个字段。它是last的缩写,但是在这两个字段中有不同的含义。日字段中的L表示一个月中的最后一天,对于一月就是 31 号,对于二月来说就是 28 号非闰年。周几字段中,它简单的表示7 or SAT。但是如果在周几字段中使用时跟在某个数字之后,它表示该月最后一个星期×。比如6L表示该月最后一个周五。当使用L选项时,指定确定的列表或者范围非常重要否则你会被结果搞糊涂的。 W —— 可用于日字段。用来指定历给定日期最近的工作日(周一到周五)。比如将日字段设为15W意为: 离该月 15 号最近的工作日。因此如果 15 号为周六触发器会在 14 号即周五调用。如果 15 号为周日,触发器会在 16 号也就是周一触发。如果 15 号为周二,那么当天就会触发。如果日字段设为1W,而一号是周六,会于下周一即当月的 3 号触发,它不会越过当月的值的范围边界。W字符只能用于日字段的值为单独的一天而不是一系列值的时候。L和W可以组合用于“日”字段表示为LW意为该月最后一个工作日。 # —— 字符可用于周几字段。该字符表示该月第几个周×。比如6#3表示该月第三个周五( 6 表示周五而#3该月第三个)。再比如: 2#1 表示该月第一个周一而4#5 该月第五个周三。注意如果你指定#5该月没有第五个周×该月是不会触发的。 C —— 字符可用于日和周几字段它是calendar的缩写。它表示为基于相关的日历所计算出的值如果有。如果没有关联的日历,那它等同于包含全部日历。日字段值为5C表示日历中的第一天或者 5 号以后。周几字段值为1C则表示日历中的第一天或者周日以后。对于月份字段和周几字段来说合法的字符都不是大小写敏感的。 备注以上读一遍有印象即可实际开发在线文档自动生成 在线Cron表达式生成器 第四章 Quartz 基本应用 4.1 节 Quartz 介绍 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目完全由Java开发可以用来执行定时任务类似于java.util.Timer。但是相较于Timer Quartz增加了很多功能 持久性作业 - 就是保持调度定时的状态; 作业管理 - 对调度作业进行有效的管理; 官方文档 Documentation Quartz Enterprise Job Scheduler 2.3.0-SNAPSHOT API 4.2 节 Quartz API 介绍 Quartz 的核心类有以下三部分 任务Job: 需要实现的任务类实现execute方法执行后完成任务触发器Trigger 包括SimpleTrigger 和 CronTrigger调度器Scheduler任务调度器负责基于Trigger触发器来执行job任务 4.3 节 Quartz 入门案例 1创建springboot工程导入依赖 pom如下 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.7.6/versionrelativePath/ !-- lookup parent from repository --/parentgroupIdtop.psjj/groupIdartifactIdquartz-study/artifactIdversion0.0.1-SNAPSHOT/versionnamequartz-study/namedescriptionquartz-study/descriptionpropertiesjava.version8/java.version/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-quartz/artifactId/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/project 2新建任务类 public class MyJob implements Job {Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {System.out.println(任务被执行了);} }3创建调度器、jobDetail 实例、trigger 实例、执行 public class QuartzTest {public static void main(String[] args) throws SchedulerException {//1.创建任务调度器SchedulerFactory factory new StdSchedulerFactory();Scheduler scheduler factory.getScheduler();//2.创建JobDetail实例并与MyJob类绑定JobDetail job JobBuilder.newJob(MyJob.class)//指定任务名组名.withIdentity(job1,group1).build();//3.构建Trigger实例每隔3s执行一次Trigger trigger TriggerBuilder.newTrigger()//指定触发器名字组名.withIdentity(trigger1,group1)//从现在触发.startNow()//触发规则3s触发一次.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(3).repeatForever()).build();//4.执行 开启任务调度器scheduler.scheduleJob(job,trigger);System.out.println(System.currentTimeMillis());scheduler.start();} } 4测试结果 每3s执行一次 第五章 QuartzAPI详细讲解 5.1 节 JobDetail JobDetail 的作用是绑定 Job是一个任务实例它为 Job 添加了许多扩展参数。 主要字段含义name任务名称group任务分组默认分组DEFAULTjobClass要执行的Job实现类jobDataMap任务参数信息JobDetail、Trigger都可以使用JobDataMap来设置一些参数或者信息 每次Scheduler调度执行一个Job的时候首先会拿到对应的Job然后创建该Job实例再去执行Job中的execute()的内容任务执行结束后关联的Job对象实例会被释放且会被JVM GC清除。 为什么设计成JobDetail Job不直接使用Job JobDetail 定义的是任务数据而真正的执行逻辑是在Job中。 这是因为任务是有可能并发执行如果Scheduler直接使用Job就会存在对同一个Job实例并发访问的问题。 而JobDetail Job 方式Sheduler每次执行都会根据JobDetail创建一个新的Job实例这样就可以 规避并发访问 的问题。 携带参数案例 package com.sh;import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; import org.springframework.scheduling.annotation.Scheduled;/*** Auther: 世豪讲java* Date: 2024/1/4 - 01 - 04 - 20:27* Decsription: com.sh* version: 1.0*/ public class QuartzTest {//test方法之后执行一次所以使用main方法public static void main(String[] args) throws SchedulerException {//1.创建任务调度器SchedulerFactory factory new StdSchedulerFactory();Scheduler scheduler factory.getScheduler();//创建JobDataMap,可携带的参数JobDataMap jobDataMap new JobDataMap();jobDataMap.put(param1,value1);jobDataMap.put(param2,value2);//2.创建JobDetail实例与MyJob类绑定JobDetail job JobBuilder.newJob(MyJob.class)//指定任务名组名.withIdentity(job1,group1)//携带参数JobDataMap.setJobData(jobDataMap).build();//3.构建Trigger实例每个3s执行一次Trigger trigger TriggerBuilder.newTrigger()//指定触发器名字组名.withIdentity(trigger1,group1)//什么时候触发.startNow()//触发规则3秒触发一次//简单的SimpleScheduleBuilder构建起.withSchedule(SimpleScheduleBuilder.simpleSchedule()//每3s触发一次.withIntervalInSeconds(3)//永远触发.repeatForever()).build();//4.调度器执行任务//把job和trigger给schedulescheduler.scheduleJob(job,trigger);System.out.println(System.currentTimeMillis());//启动任务scheduler.start();} }public class MyJob implements Job {Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {//获取jobDataMapJobDataMap jobDataMap jobExecutionContext.getJobDetail().getJobDataMap();System.out.println(任务被执行了jobDataMap.get(param1)jobDataMap.get(param2));} } 5.2 节 SimpleTrigger 这是比较简单的一类触发器用它能实现很多基础的应用。使用它的主要场景包括 在指定时间段内执行一次任务 最基础的 Trigger 不设置循环设置开始时间。 在指定时间段内循环执行任务 在 1 基础上加上循环间隔。可以指定 永远循环、运行指定次数 示例 Trigger trigger TriggerBuilder.newTrigger().withIdentity(trigger2,group1).startNow().withSchedule(//使用简单触发器SimpleScheduleBuilder.simpleSchedule().//3s间隔执行withIntervalInSeconds(3).//执行6次 count1withRepeatCount(5)).build(); 5.3 节 CronTrigger CronTrigger 是基于日历的任务调度器在实际应用中更加常用。虽然很常用但是知识点都一样只是可以通过表达式来设置时间而已。使用方式就是绑定调度器时换一下 Trigger trigger TriggerBuilder.newTrigger().withIdentity(trigger2,group1).startNow().withSchedule(//使用日历触发器CronScheduleBuilder.cronSchedule(0/1 * * * * ? )).build(); 第六章 SpringBoot整合Quartz 6.1 节 SpringBoot整合Quartz 接下来实现SpringBoot整合Quartz动态实现任务调度动态任务调度ui参考 该UI需要自己创建 1添加依赖   ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.7.6/versionrelativePath/ !-- lookup parent from repository --/parentgroupIdtop.psjj/groupIdartifactIdquartz-study/artifactIdversion0.0.1-SNAPSHOT/versionnamequartz-study/namedescriptionquartz-study/descriptionpropertiesjava.version8/java.version/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-quartz/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jdbc/artifactId/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.26/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependencydependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.60/version/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/project2编写application.yml配置文件内容如下 server:port: 80 spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: 123456url: jdbc:mysql://127.0.0.1:3306/quartz?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghai# 定时配置quartz:# 相关属性配置properties:org:quartz:# 数据源dataSource:globalJobDataSource:# URL必须大写URL: jdbc:mysql://127.0.0.1:3306/quartz?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghaidriver: com.mysql.cj.jdbc.DrivermaxConnections: 5username: rootpassword: 123456# 必须指定数据源类型provider: hikaricpscheduler:instanceName: globalScheduler# 实例idinstanceId: AUTOtype: com.alibaba.druid.pool.DruidDataSourcejobStore:# 数据源dataSource: globalJobDataSource# JobStoreTX将用于独立环境提交和回滚都将由这个类处理class: org.quartz.impl.jdbcjobstore.JobStoreTX# 驱动配置driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate# 表前缀tablePrefix: QRTZ_# 失效阈值(只有配置了这个时间超时策略根据这个时间才有效)misfireThreshold: 100# 集群配置isClustered: true# 线程池配置threadPool:class: org.quartz.simpl.SimpleThreadPool# 线程数threadCount: 10# 优先级threadPriority: 5 这里面有quartz的数据源线程池集群和misfire相关配置简单配置更多的配置可以到官网查看。 Configuration Reference 配置application.properties 自动生成表 只需要执行一次再次执行会重置表中数据影响实际业务 spring.quartz.jdbc.initialize-schema: always spring.quartz.job-store-type: jdbc 3实体类 Data public class JobInfo {/*** 任务名称*/private String jobName;/*** 任务组*/private String jobGroup;/*** 触发器名称*/private String triggerName;/*** 触发器组*/private String triggerGroup;/*** cron表达式*/private String cron;/*** 类名*/private String className;/*** 状态*/private String status;/*** 下一次执行时间*/private String nextTime;/*** 上一次执行时间*/private String prevTime;/*** 配置信息(data)*/private String config; } 4任务类 * DisallowConcurrentExecution这个注解的作用就是同一个任务必须在上一次执行完毕之后再按照corn时间执行不会并行执行* PersistJobDataAfterExecution这个注解的作用就是下一个任务用到上一个任务的修改数据定时任务里面的jobData数据流转*/DisallowConcurrentExecution PersistJobDataAfterExecution Slf4j Component public class MyTask extends QuartzJobBean {Overrideprotected void executeInternal(JobExecutionContext context) throws JobExecutionException {System.out.println(任务1正在执行... LocalDateTime.now());// 执行9秒try {Thread.sleep(9000);System.out.println(任务1执行完毕... LocalDateTime.now());} catch (InterruptedException e) {throw new RuntimeException(e);}} }这个类就是继承的QuartzJobBean当然也可以实现Job接口这个类就是任务需要具体执行的业务操作类类上面添加了两个注解这两个注解的目的就是让同一个任务必须在上一个任务执行完毕之后再按照触发后续执行以及定时任务里面的JobDataMap能够在任务中流转以及修改更新不添加注解的情况下JobDataMap里面的数据不能在任务之间流转以及任务的触发不会参照上一任务是否执行完毕。 5JobHandle任务的开关停删操作 Configuration public class JobHandler {Resourceprivate Scheduler scheduler;/*** 添加任务*/SuppressWarnings(unchecked)public void addJob(JobInfo jobInfo) throws SchedulerException, ClassNotFoundException {Objects.requireNonNull(jobInfo, 任务信息不能为空);// 生成job keyJobKey jobKey JobKey.jobKey(jobInfo.getJobName(), jobInfo.getJobGroup());// 当前任务不存在才进行添加if (!scheduler.checkExists(jobKey)) {ClassJob jobClass (ClassJob)Class.forName(jobInfo.getClassName());// 任务明细JobDetail jobDetail JobBuilder.newJob(jobClass).withIdentity(jobKey).withIdentity(jobInfo.getJobName(), jobInfo.getJobGroup()).withDescription(jobInfo.getJobName()).build();// 配置信息jobDetail.getJobDataMap().put(config, jobInfo.getConfig());// 定义触发器TriggerKey triggerKey TriggerKey.triggerKey(jobInfo.getTriggerName(), jobInfo.getTriggerGroup());// 设置任务的错过机制Trigger trigger TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(CronScheduleBuilder.cronSchedule(jobInfo.getCron()).withMisfireHandlingInstructionDoNothing()).build();scheduler.scheduleJob(jobDetail, trigger);} else {throw new SchedulerException(jobInfo.getJobName() 任务已存在无需重复添加);}}/*** 任务暂停*/public void pauseJob(String jobGroup, String jobName) throws SchedulerException {JobKey jobKey JobKey.jobKey(jobName, jobGroup);if (scheduler.checkExists(jobKey)) {scheduler.pauseJob(jobKey);}}/*** 继续任务*/public void continueJob(String jobGroup, String jobName) throws SchedulerException {JobKey jobKey JobKey.jobKey(jobName, jobGroup);if (scheduler.checkExists(jobKey)) {scheduler.resumeJob(jobKey);}}/*** 删除任务*/public boolean deleteJob(String jobGroup, String jobName) throws SchedulerException {JobKey jobKey JobKey.jobKey(jobName, jobGroup);if (scheduler.checkExists(jobKey)) {// 这里还需要先删除trigger相关//TriggerKey triggerKey TriggerKey.triggerKey(jobInfo.getTriggerName(), jobInfo.getTriggerGroup());//scheduler.getTrigger()//scheduler.rescheduleJob()return scheduler.deleteJob(jobKey);}return false;}/*** 获取任务信息*/public JobInfo getJobInfo(String jobGroup, String jobName) throws SchedulerException {JobKey jobKey JobKey.jobKey(jobName, jobGroup);if (!scheduler.checkExists(jobKey)) {return null;}List? extends Trigger triggers scheduler.getTriggersOfJob(jobKey);if (Objects.isNull(triggers)) {throw new SchedulerException(未获取到触发器信息);}TriggerKey triggerKey triggers.get(0).getKey();Trigger.TriggerState triggerState scheduler.getTriggerState(triggerKey);JobDetail jobDetail scheduler.getJobDetail(jobKey);JobInfo jobInfo new JobInfo();jobInfo.setJobName(jobGroup);jobInfo.setJobGroup(jobName);jobInfo.setTriggerName(triggerKey.getName());jobInfo.setTriggerGroup(triggerKey.getGroup());jobInfo.setClassName(jobDetail.getJobClass().getName());jobInfo.setStatus(triggerState.toString());if (Objects.nonNull(jobDetail.getJobDataMap())) {jobInfo.setConfig(JSONObject.toJSONString(jobDetail.getJobDataMap()));}CronTrigger theTrigger (CronTrigger) triggers.get(0);jobInfo.setCron(theTrigger.getCronExpression());return jobInfo;} } 6Controller调用接口实现任务操作 RestController RequestMapping(/job) public class QuartzController {Resourceprivate JobHandler jobHandler;Resourceprivate Scheduler scheduler;/*** 查询所有的任务*/RequestMapping(/all)public ListJobInfo list() throws SchedulerException {ListJobInfo jobInfos new ArrayList();ListString triggerGroupNames scheduler.getTriggerGroupNames();for (String triggerGroupName : triggerGroupNames) {SetTriggerKey triggerKeySet scheduler.getTriggerKeys(GroupMatcher.triggerGroupEquals(triggerGroupName));for (TriggerKey triggerKey : triggerKeySet) {Trigger trigger scheduler.getTrigger(triggerKey);JobKey jobKey trigger.getJobKey();JobInfo jobInfo jobHandler.getJobInfo(jobKey.getGroup(), jobKey.getName());jobInfos.add(jobInfo);}}return jobInfos;}/*** 添加任务*/PostMapping(/add)public JobInfo addJob(RequestBody JobInfo jobInfo) throws SchedulerException, ClassNotFoundException {jobHandler.addJob(jobInfo);return jobInfo;}/*** 暂停任务*/RequestMapping(/pause)public void pauseJob(RequestParam(jobGroup) String jobGroup, RequestParam(jobName) String jobName)throws SchedulerException {jobHandler.pauseJob(jobGroup, jobName);}/*** 继续任务*/RequestMapping(/continue)public void continueJob(RequestParam(jobGroup) String jobGroup, RequestParam(jobName) String jobName)throws SchedulerException {jobHandler.continueJob(jobGroup, jobName);}/*** 删除任务*/RequestMapping(/delete)public boolean deleteJob(RequestParam(jobGroup) String jobGroup, RequestParam(jobName) String jobName)throws SchedulerException {return jobHandler.deleteJob(jobGroup, jobName);} } 7测试 6.2 节 如何实现开启服务自动执行任务 PostConstructpublic void init(){addMyTask();}public void addMyTask(){try {JobInfo jobInfo new JobInfo();jobInfo.setJobGroup(group1);jobInfo.setJobName(job2);jobInfo.setCron(0/1 * * * * ?);jobInfo.setClassName(com.sh.task.MyTask);jobInfo.setTriggerName(trigger1);jobInfo.setTriggerGroup(triggerGroup1);this.addJob(jobInfo);} catch (SchedulerException e) {throw new RuntimeException(e);} catch (ClassNotFoundException e) {throw new RuntimeException(e);}} 6.3 节 单线程与多线程执行任务调度的区别 6.3.1 单线程运行任务 结论单线程运行任务不同任务之间串行任务A运行时间会响应任务B运行间隔 6.3.2 多线程执行任务 再创建一个mytask2 DisallowConcurrentExecution PersistJobDataAfterExecution Slf4j Component public class MyTask2 extends QuartzJobBean {Overrideprotected void executeInternal(JobExecutionContext context) throws JobExecutionException {log.info(任务2执行... LocalDateTime.now());} } PostConstruct public void init(){addMyTask();addMyTask2(); } public void addMyTask() {try {JobInfo jobInfo new JobInfo();jobInfo.setJobName(job1);jobInfo.setJobGroup(group1);jobInfo.setTriggerName(trigger1);jobInfo.setTriggerGroup(triggerGroup1);jobInfo.setClassName(top.psjj.task.MyTask);jobInfo.setCron(0/1 * * * * ? *);this.addJob(jobInfo);} catch (SchedulerException e) {throw new RuntimeException(e);} catch (ClassNotFoundException e) {throw new RuntimeException(e);} } public void addMyTask2() {try {JobInfo jobInfo new JobInfo();jobInfo.setJobName(job2);jobInfo.setJobGroup(group1);jobInfo.setTriggerName(trigger2);jobInfo.setTriggerGroup(triggerGroup1);jobInfo.setClassName(top.psjj.task.MyTask2);jobInfo.setCron(0/1 * * * * ? *);this.addJob(jobInfo);} catch (SchedulerException e) {throw new RuntimeException(e);} catch (ClassNotFoundException e) {throw new RuntimeException(e);} } 显然任务2还是1s执行一次没有收到任务1执行时间干扰这是任务2和任务1用的线程不同。 任务二不受任务一的影响 6.4 节 任务调度持久化的好处 如果任务调度没有持久化而任务又是基于动态设置不是开机自启的会有一个问题服务重启之后设置的任务都会失效了。如果任务整合持久化之后设置的动态任务信息就会保存到数据库开机自启就会加载这些数据库信息就会按照原来的设置运行任务。 但是一定要把建表配置注释掉 #spring.quartz.jdbc.initialize-schema: always #spring.quartz.job-store-type: jdbc 6.5 节 Quartz 集群执行与单机执行区别 Quartz是一个开源的作业调度框架用于在Java应用程序中调度任务。Quartz集群和非集群的区别主要体现在以下几个方面 高可用性Quartz集群可以提供高可用性即使其中一个节点出现故障其他节点仍然可以继续工作。而非集群模式下如果应用程序所在的服务器出现故障任务调度将会停止。 负载均衡Quartz集群可以通过将任务分配给不同的节点来实现负载均衡。这意味着任务将在集群的各个节点上分布从而提高系统整体的性能和吞吐量。非集群模式下所有的任务将在单个节点上运行可能会导致性能瓶颈。 数据共享Quartz集群可以共享任务调度的数据包括作业和触发器等。这意味着当一个节点添加或删除任务时其他节点也能够感知到。非集群模式下每个节点都有自己独立的任务调度数据可能导致数据不一致。 需要注意的是Quartz集群需要配置和管理多个节点可能需要更多的系统资源和维护工作。非集群模式则相对简单适用于小规模的应用程序。选择使用哪种模式应根据具体的需求和系统要求来决定。 第七章 总结 【1】简述一下什么是任务调度 答任务调度就是按照特定时间规则执行系统某个固定的业务逻辑。任务调度底层是使用jdk的Timer实现的。单体项目建议使用Spring-task任务调度技术分布式架构建议使用quartz任务调度框架。Spring-task是单线程运行旳Quartz是多线程运行的且功能更为丰富支持作业管理。 【2】说一下你都用过什么任务调度技术他们的区别是什么 答Spring-task是单线程且功能简单。执行任务只需开启开关EnableScheduling在要执行的任务方法上加 Scheduled(cron */1 * * * * *)注解。它的使用弊端 任务A的执行时间会影响任务B的执行间隔但是任务A和任务B是两个任务不应该相互影响。 没有固定组件持久化等功能也就没法形成作业系统 Quartz是多线程的高可用的任务调度框架支持持久化多线程集群模式且有固定组件结构Job、Trigger、scheduler。他的优点一一说明 有固定组件有持久化功能这样就能基于Quartz开发一个任务调度系统通过UI界面去管理任务调度。 任务进行持久化之后重启服务器会加载持久化的任务继续执行。 任务支持集群模式如果任务调度模块是一个集群n个节点那么任务调度不会因为一个节点挂掉而挂掉且任务在集群之间形成负载均衡。
http://www.yingshimen.cn/news/48652/

相关文章:

  • 电商网站怎么做的访问网站需要账号密码
  • 个人网站怎么做推广久久建筑资料网
  • 网站怎么做 流程微信公众号登录入口在哪里
  • 个人网上银行seo技术服务外包
  • html5响应式布局网站企业网站现状
  • 网站制作软件dw的全称seo 优化 工具
  • 网站vi设计公司护肤品网页设计图片
  • 厦门网站建设公司排名重庆seo怎么样
  • 怎么用jsp做网站详细asp网站建设公司
  • 网站建设与营销经验做网站没资源
  • 云南建设厅建筑业管理网站湖北黄石网站群建设
  • 开发商城网站多少钱潍坊建立企业网站公司
  • 东莞响应式网站哪家好域名备案企业网站内容
  • 青海省建设厅网站姚宽一正能量网站下载
  • 网站目录架构电子商务网站建设知识
  • 如何登陆工商局网站做变更做logo的网站
  • 网站的页面布局是什么wordpress官方下载
  • 老鹰网营销型网站建设聊天直播软件开发
  • 网站死链怎么办wordpress文章和页面的区别
  • 建设银行发卡银行网站贵阳app开发公司哪家强
  • 广西做网站企业做网站的意义
  • 站群网站和做seo那个号黑帽seo培训网
  • 温州手机网站开发如何将qq音乐链接到wordpress
  • 山东东营市天气预报娄底网站seo
  • 游戏直播网站怎么做网站备案网站简介
  • 定制西服如何做好网站优化
  • 电商网站开发进度表wordpress 增加浏览数
  • 网站怎么做导航页中国工商信息查询网
  • 余姚物流做网站网站目录权限
  • 做管理培训的网站有什么安徽义信建设网站