任务执行和调度----Spring线程池/Quartz

定时任务

在服务器中可能会有定时任务,但是不知道分布式系统下次会访问哪一个服务器,所以服务器中的任务就是相同的,这样会导致浪费。使用Quartz可以解决这个问题。
在这里插入图片描述

JDK线程池

@RunWith(SpringRunner.class)
@SpringBootTest	
@ContextConfiguration(classes = MyCommunityApplication.class)
public class ThreadPoolTest {private Logger logger = LoggerFactory.getLogger(ThreadPoolTest.class);// JDK's normal thread-poolprivate ExecutorService executorService = Executors.newFixedThreadPool(5);// JDK's thread pool that periodically executes tasksprivate ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);private void sleep(long m){try{Thread.sleep(m);} catch(InterruptedException e){e.printStackTrace();}}@Testpublic void testExecutorService() {Runnable task = new Runnable() {@Overridepublic void run() {logger.info("hello executor service");}};for(int i = 0; i < 10; i++) {executorService.submit(task);}sleep(10000);}@Testpublic void testScheduleExecutorService(){Runnable task = new Runnable() {@Overridepublic void run() {logger.info("hello executor service");}};// 初始时间间隔为10000ms,任务间隔为1000msfor(int i = 0; i < 10; i++) {scheduledExecutorService.scheduleAtFixedRate(task, 10000, 1000, TimeUnit.MILLISECONDS);}sleep(30000);}
}

Spring线程池

配置application.properties

# Spring thread pool
# TaskExecutionProperties
spring.task.execution.pool.core-size=5
spring.task.execution.pool.max-size=15
spring.task.execution.pool.queue-capacity=100
# TaskScheduleProperties
spring.task.scheduling.pool.size=5

Spring线程池默认不开启定时线程池,需要新建配置类手动开启:

@Configuration
@EnableScheduling	// 允许定时线程池
@EnableAsync		// 允许多线程执行
public class ThreadPoolConfig {}

基于注入

测试方法:

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = MyCommunityApplication.class)
public class ThreadPoolTest {private Logger logger = LoggerFactory.getLogger(ThreadPoolTest.class);// Spring's normal thread pool@Autowiredprivate ThreadPoolTaskExecutor taskExecutor;// Spring's thread pool that periodically executes tasks// 如果配置类不加@EnableScheduling会报错@Autowiredprivate ThreadPoolTaskScheduler taskScheduler;private void sleep(long m){try{Thread.sleep(m);} catch(InterruptedException e){e.printStackTrace();}}@Testpublic void testThreadPoolTaskExecutor(){Runnable task = new Runnable() {@Overridepublic void run() {logger.info("hello spring thread pool");}};for(int i = 0; i < 10; i++){taskExecutor.submit(task);}sleep(10000);}@Testpublic void testThreadPoolTaskScheduler(){Runnable task = new Runnable() {@Overridepublic void run() {logger.info("hello spring thread pool");}};Date start = new Date(System.currentTimeMillis() + 10000);
//        for(int i = 0; i < 10; i++){taskScheduler.scheduleAtFixedRate(task, start, 1000);
//        }sleep(10000);}
}

基于注解

@Service
public class AlphaService {// 此前已经在配置类上允许了异步及定时// @EnableScheduling	// 允许定时线程池// @EnableAsync		// 允许异步执行// 加上这个注解说明是异步的@Asyncpublic void execute1(){logger.info("hello");}// 加上这个注解说明是定时任务// 第一次延迟10s,之后每次间隔1s// @Scheduled默认为单线程,开启多个任务时,任务的执行时机会受上一个任务执行时间的影响。@Scheduled(initialDelay = 10000, fixedRate = 1000)public void execute2(){logger.info("hello2");}
}
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = MyCommunityApplication.class)
public class ThreadPoolTest {private Logger logger = LoggerFactory.getLogger(ThreadPoolTest.class);// Spring's normal thread pool@Autowiredprivate ThreadPoolTaskExecutor taskExecutor;// Spring's thread pool that periodically executes tasks@Autowiredprivate ThreadPoolTaskScheduler taskScheduler;@Autowiredprivate AlphaService alphaService;@Testpublic void testThreadPoolTaskExecutorSimple(){for(int i=0; i< 10; ++ i){alphaService.execute1();}sleep(10000);}@Testpublic void testThreadPoolTaskExecutorSimple2(){// 此处不需要调用alphaService.execute2方法// 因为有Scheduled注解的方法在程序开始时会自动执行
//      alphaService.execute2();sleep(30000);}
}

分布式定时任务

新建任务

参考链接
在这里插入图片描述
引入依赖包

		<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-quartz --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId>
<!--			<version>3.1.2</version>--></dependency>

配置Quartz

# QuartzProperties
spring.quartz.job-store-type=jdbc
spring.quartz.scheduler-name=communityScheduler
spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
#spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
spring.quartz.properties.org.quartz.jobStore.class=org.springframework.scheduling.quartz.LocalDataSourceJobStore
spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
spring.quartz.properties.org.quartz.jobStore.isClustered=true
spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
spring.quartz.properties.org.quartz.threadPool.threadCount=5

定义Job类:

public class AlphaJob implements Job {@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {System.out.println(Thread.currentThread().getName() + ":execute a quartz job");}
}

定义Quartz的配置类,该配置类只执行一次便被存入数据库的几个表中在这里插入图片描述

// this configuration just for the first execution, and then the configuration will be saved in the database
@Configuration
public class QuartzConfig {// `FactoryBean` simplify the instantiation process of `Bean`// 1.The instantiation process of `Bean` is encapsulated through `FactoryBean`// 2.Assemble `FactoryBean` into `Spring`'s container// 3.Inject `FactoryBean` into the other beans// 4.This bean can acquire the object instance of the bean managed by the `FactoryBean`// inject `JobDetailFactoryBean` into this class// config `JobDetail`@Beanpublic JobDetailFactoryBean alphaJobDetail() {JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();factoryBean.setJobClass(AlphaJob.class);factoryBean.setName("alphaJob");factoryBean.setGroup("alphaGroup");// this task will be stored permanently although there are no triggers existingfactoryBean.setDurability(true);// this task can be recovered after meeting some faultsfactoryBean.setRequestsRecovery(true);return factoryBean;}// the `JobDetail` used is the object instance in `JobDetailFactoryBean`// config `Trigger(SimpleTriggerFactoryBean, CronTriggerFactoryBean)`@Beanpublic SimpleTriggerFactoryBean alphaTrigger(JobDetail alphaJobDetail) {SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();factoryBean.setJobDetail(alphaJobDetail);factoryBean.setName("alphaTrigger");factoryBean.setGroup("alphaGroup");// the interval of the triggerfactoryBean.setRepeatInterval(3000);// use an object to store the status of the job, `JobDataMap()` is the default objectfactoryBean.setJobDataMap(new JobDataMap());return factoryBean;}
}

启动程序后,Job自动执行,可以看到任务相关的信息已经自动加入到了表中:
在这里插入图片描述

删除任务

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = MyCommunityApplication.class)
public class QuartzTest {@Autowiredprivate Scheduler scheduler;@Testpublic void testDeleteJob(){try {boolean result = scheduler.deleteJobs(Collections.singletonList(new JobKey("alphaJob", "alphaGroup")));System.out.println(result);} catch (SchedulerException e) {throw new RuntimeException(e);}}
}

可以看到,数据库中已经没有了关于任务的记录
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/118237.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark-Core核心算子

文章目录 一、数据源获取1、从集合中获取2、从外部存储系统创建3、从其它RDD中创建4、分区规则—load数据时 二、转换算子(Transformation)1、Value类型1.1 map()_1.2 mapPartitions()1.3 mapPartitionsWithIndex(不常用)1.4 filterMap()_扁平化&#xff08;合并流&#xff09;…

卡特兰数和算法

在组合数学中&#xff0c;卡特兰数是一系列自然数&#xff0c;出现在各种组合计数问题中&#xff0c;通常涉及递归定义的对象。它们以比利时数学家尤金查尔斯卡特兰&#xff08;Eugne Charles Catalan&#xff09;的名字命名。 卡特兰数序列是1, 1, 2, 5, 14, 42......&#xf…

java.sql.SQLException: com.mysql.cj.jdbc.Driver

这篇文章分享一下Springboot整合Elasticsearch时遇到的一个问题&#xff0c;项目正常启动&#xff0c;但是查询数据库的时候发生了一个异常java.sql.SQLException: com.mysql.cj.jdbc.Driver java.sql.SQLException: com.mysql.cj.jdbc.Driverat com.alibaba.druid.util.JdbcU…

【德哥说库系列】-ASM管理Oracle 19C单实例部署

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

微软 Turing Bletchley v3视觉语言模型更新:必应搜索图片更精准

据微软新闻稿透露&#xff0c;在推出第三代Turing Bletchley视觉语言模型后&#xff0c;微软计划逐步将其整合到Bing等相关产品中&#xff0c;以提供更出色的图像搜索体验。这款模型最初于2021年11月面世&#xff0c;并在2022年秋季开始邀请用户测试。 凭借用户的反馈和建议&am…

mapboxGL3新特性介绍

概述 8月7日&#xff0c;mapboxGL发布了3版本的更新&#xff0c;本文带大家一起来看看mapboxGL3有哪些新的特性。 新特新 如上图所示&#xff0c;是mapboxGL官网关于新版的介绍&#xff0c;大致翻译如下&#xff1a; 增强了web渲染的质量、便捷程度以及开发人员体验&#xff…

【云计算•云原生】5.云原生之初识DevOps

文章目录 1.DevOps背景2.DevOps概念3.DevOps工具链 1.DevOps背景 软件开发必须包含两个团队&#xff1a;开发团队和运维团队 开发团队负责开发项目&#xff0c;系统迭代更新运维团队负责项目测试以及部署上线&#xff0c;维持系统稳定运行 一个软件周期中是由这两个团队相互…

buildroot修改内核防止清理重新加载办法

当你使用 Buildroot 构建 Linux 内核时&#xff0c;如果对内核文件进行了手动修改&#xff0c;重新执行 Buildroot 的构建过程将会覆盖你所做的修改。这是因为 Buildroot会根据配置重新下载、提取和编译内核。 为了避免在重新构建时覆盖你的修改&#xff0c;可以采取以下两种方…

数据可视化与数字孪生:理解两者的区别

在数字化时代&#xff0c;数据技术正在引领创新&#xff0c;其中数据可视化和数字孪生是两个备受关注的概念。尽管它们都涉及数据的应用&#xff0c;但在本质和应用方面存在显著区别。本文带大探讨数据可视化与数字孪生的差异。 概念 数据可视化&#xff1a; 数据可视化是将复…

Windows下将nginx等可执行文件添加为服务

Windows下将nginx等可执行文件添加为服务 为什么将可执行文件添加为服务&#xff1f;将可执行文件添加为服务的步骤步骤 1&#xff1a;下载和安装 Nginx步骤 2&#xff1a;添加为服务方法一&#xff1a;使用 Windows 自带的 sc 命令方法二&#xff1a;使用 NSSM&#xff08;Non…

Vue实战【调整Vue-element-admin中的菜单栏,并添加顶部模块菜单栏】

目录 &#x1f31f;前言&#x1f31f;小伙伴们先看&#x1f31f;实现思路&#x1f31f;具体代码&#x1f31f;最后 &#x1f31f;前言 因为最近在整合公司的项目&#xff0c;需要把所有系统里的功能集成到一个项目里&#xff0c;这样就导致菜单栏目录会特别的多&#xff0c;不…

【MySQL学习笔记】(七)内置函数

内置函数 日期函数示例案例-1案例-2 字符串函数示例 数学函数其他函数 日期函数 示例 获得当前年月日 mysql> select current_date(); ---------------- | current_date() | ---------------- | 2023-09-03 | ---------------- 1 row in set (0.00 sec)获得当前时分秒…

ARM 汇编基础知识

1.为什么学习汇编&#xff1f; 我们在进行嵌入式 Linux 开发的时候是绝对要掌握基本的 ARM 汇编&#xff0c;因为 Cortex-A 芯片一 上电 SP 指针还没初始化&#xff0c; C 环境还没准备好&#xff0c;所以肯定不能运行 C 代码&#xff0c;必须先用汇编语言设置好 C 环境…

HarmonyOS应用开发者高级认证练习题

系列文章目录 HarmonyOS应用开发者基础认证练习题 HarmonyOS应用开发者高级认证练习题 文章目录 系列文章目录前言一、判断二、单选三、多选 前言 本文所有内容来源于个人进行HarmonyOS应用开发者系列认证的学习过程中所做过的练习题&#xff0c;所有答案均是个人作答&#x…

手撕 视觉slam14讲 ch7 / pose_estimation_3d2d.cpp (1)

首先理清我们需要实现什么功能&#xff0c;怎么实现&#xff0c;提供一份整体逻辑&#xff1a;包括主函数和功能函数 主函数逻辑&#xff1a; 1. 读图,两张rgb&#xff08;cv::imread&#xff09; 2. 找到两张rgb图中的特征点匹配对 2.1定义所需要的参数&#xff1a;keypoints…

手机怎么剪视频?分享一些剪辑工具和注意事项

视频剪辑是一种将多个视频片段进行剪切、合并和编辑的技术&#xff0c;它可以帮助我们制作出精彩的视频作品。如今&#xff0c;随着智能手机的普及&#xff0c;我们可以随时随地使用手机进行视频剪辑。本文将为大家介绍一些手机剪辑工具和注意事项&#xff0c;帮助大家更好地进…

MATLAB实现AHP层次分析法——以情人节选取礼物为例

问题背景&#xff1a; 情人节来临之际&#xff0c;广大直男&#xff08;女&#xff09;同胞在给异性朋友选购礼物时会遇到难题——什么才是礼物好坏最重要的标准&#xff1f;基于层次分析法AHP进行计算&#xff0c;得出最高权重的指标&#xff0c;给出各位朋友选购礼物的一种思…

Vue框架--Vue中的数据绑定

Vue中有两种数据绑定的方式 1.单向数据绑定(v-band):数据只能够从data流向页面 2.双向数据绑定(v-model):数据不仅仅能够从data流向页面&#xff0c;也可以从页面流向data。 备注: 1.双向绑定一般都应用在表单类元素上。(如:input、select等有value属性值的标签上) 2.…

[ZenTao]源码阅读:自定义任务类型

1、module/custom/control.php 2、module/custom/model.php

C#-单例模式

文章目录 单例模式的概述为什么会有单例模式如何创建单例模式1、首先要保证&#xff0c;该对象 有且仅有一个2、其次&#xff0c;需要让外部能够获取到这个对象 示例通过 属性 获取单例 单例模式的概述 总结来说&#xff1a; 单例 就是只有 一个实例对象。 模式 说的是设计模式…