五种定时任务方案(Timer+ScheduleExecutorService+spring task+多线程执行+quartz)

news2024/10/2 3:35:01

方案一:Timer

(1)Timer.schedule(TimerTask task,Date time)安排在制定的时间执行指定的任务。

(2)Timer.schedule(TimerTask task,Date firstTime ,long period)安排指定的任务在指定的时间开始进行重复的固定延迟执行.

(3)Timer.schedule(TimerTask task,long delay)安排在指定延迟后执行指定的任务.

(4)Timer.schedule(TimerTask task,long delay,long period)安排指定的任务从指定的延迟后开始进行重复的固定延迟执行.

(5)Timer.scheduleAtFixedRate(TimerTask task,Date firstTime,long period)安排指定的任务在指定的时间开始进行重复的固定速率执行.

(6)Timer.scheduleAtFixedRate(TimerTask task,long delay,long period)安排指定的任务在指定的延迟后开始进行重复的固定速率执行.

public class TestTimer{
	
	public static void main(String[] args){
		
		TimerTask timerTask = new TimerTask(){
			@Override
			public void run(){
				System.out.println("tesk run:" + new Date());
			}
		};

		Timer timer = new Timer();

		//安排指定的任务在指定的时间开始进行重复的而固定延迟执行,每3庙执行一次
		timer.schedule(timeTask,10,3000);
	}
}

在这里插入图片描述
在这里插入图片描述

方案二:ScheduleExecutorService

public class TestScheduleExecutorService{
	
	public static void main(String[] args){
		
		ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();

		/**
			参数:任务体、首次执行的延时时间、任务执行间隔、间隔时间单位
		*/
		service.scheduleAtFixedRate(()->System.out.println("task ScheduledExecutorService "+new Date()),
									 0, 3, TimeUnit.SECONDS);
	}
}

在这里插入图片描述
在这里插入图片描述

方案三:SpringTask

Cron表达式:若干数字、空格、符号按照一定的规则组成一组字符串来表达时间信息。在线corn表达式生成器:https://www.pppet.net/

标准格式:A B C D E F G
A表示秒;B表示分;C表示小时;D表示日;E表示月;F表示星期;G表示年
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

spring3.0以后自带的task

注解方式:

<!--启动定时任务的注解驱动-->
  <task:annotation-driven/>
@Slf4j
@Component
public class ScheduledService{
	
	@Scheduled(cron = "0/5 * * * * *")
	public void scheduled(){
		log.info("====>使用cron {}",System.currentTimeMillis());
	}

	@Scheduled(fixedRate = 5000) //每5秒运行一次
	public void scheduled1(){
		log.info("=====>>>>>使用fixedRate{}", System.currentTimeMillis());
	}

	@Scheduled(fixedDelay = 5000)
    public void scheduled2() {
        log.info("=====>>>>>fixedDelay{}",System.currentTimeMillis());
    }
}

在这里插入图片描述

配置方式:

 <!--配置定时任务-->
    <task:scheduled-tasks>
    	<!--<task:scheduled ref="job1" method="run" cron="0/5 * * * * ?"/>-->
        <task:scheduled ref="job1" method="run" fixed-rate="5000"/>
    </task:scheduled-tasks>

每5秒执行一次

public class job1 {
    public void run(){
        System.out.println("job1....."+new Date());
    }
}


方案四:多线程执行

基于注解设置多线程

@Component
@EnableScheduling //开启定时任务
@EnableAsync //开启多线程
public class MultithreadScheduleTask{
	
	@Async
	@Scheduled(fixedDDelay = 5000) //间隔5秒
	public void first(){
		System.out.println("第一个定时任务开始:" + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
		System.out.println();
		Thread.sleep(1000 * 10);
	}

	 @Async
    @Scheduled(fixedDelay = 5000)
    public void second() {
        System.out.println("第二个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
        System.out.println();
    }
}

在这里插入图片描述

方案五:quartz

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
@Configuration
public class QuartzConfig{
	
	@Bean
	public JobDetail teatQuaritzDetail(){
		return JobBuilder.newJob(MyAuartz.class).withIdentity("myQuartz").storeDurably().build();
	}

	@Bean
	public Trigger testQuartzTrigger(){
		SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
												.withIntervalInSeconds(10) //设置时间周期单位
												.repeatForever();
		return TriggerBuilder.newTrigger().forJob(testQuartzDetail())
										  .withIdentity("testQuartz")
										  .withSchedule(scheduleBuilder)
										  .build();
	}
}

只要启动SpringBoot羡慕就会输出:
在这里插入图片描述

配置的方式:

  <dependency>
      <groupId>org.quartz-scheduler</groupId>
      <artifactId>quartz</artifactId>
      <version>2.3.2</version>
 </dependency>
 <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>5.3.2</version>
  </dependency>

	<!-- 线程池 -->
    <bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <property name="corePoolSize" value="10" />
        <property name="maxPoolSize" value="100" />
        <property name="queueCapacity" value="500" />
    </bean>
    <!--FixedRate 定时任务 -->
    <bean id="quartzJob" class="com.wanmait.mavendemo.job.QuartzJob" />
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="quartzJob" />
        <property name="targetMethod" value="print" />
    </bean>


<!-- Cron   quartz-2.x 的配置  时间调度的两种写法 fixedRate和cron-->
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean" >
        <property name="jobDetail" ref="jobDetail" />
        <property name="cronExpression" value="0/5 * * * * ?" />
    </bean>
    <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        <property name="jobDetail" ref="jobDetail"></property>
        <property name="startDelay" value="0" />
        <!-- 调度工厂实例化后,经过 0 秒 开始执行调度 -->
        <property name="repeatInterval" value="2000" />
        <!-- 每 2 秒调度一次 -->
    </bean>
    <!-- 调度 看你用哪个 两种选一种   -->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <!--<ref bean="simpleTrigger" />-->
                <ref bean="cronTrigger"/>
            </list>
        </property>
        <property name="taskExecutor" ref="executor" />
    </bean>

public class QuartzJob{
	public void print(){
		System.out.println("quartzjob.........."+new Date());
	}
}

SpringBoot定时任务:
在启动类上加@EnableScheduling开启定时任务
写一个任务类添加@Component注解被spring管理,在方法上添加@Scheduled(fixedRate = 2000)或者 @Scheduled(cron = “0-5 * * ? * *”)

动态调整定时任务执行corn表达式、动态关闭开启定时任务

@Configuration
public class ScheduledConfig implements SchedulingConfigurer{
	
	@Autowired
	private ApplicationContext context;

	@Override
	public void confugureTasks(ScheduledTaskRegistrar taskRegistrar){
		
		for(SpringScheuledCron springScheduledCron:cronRepository.findAll()){
			
			Class<?> clazz;
			Object task;

			try{
				clazz = Class.forName(springScheduledCron.getCronKey());
				task = context.getBean(clazz);
			}catch(ClassNotFoundException e){
				throw new IllegalArgumentException("spring_scheduled_cron表数据" + springScheduledCron.getCronKey() + "有误", e);
			}catch(BeansException e){
				throw new IllegalArgumentException(springScheduledCron.getCronKey() + "未纳入到spring管理", e);
			}

			Assert.isAssignable(ScheduledOfTask.class, task.getClass(), "定时任务类必须实现ScheduledOfTask接口");
		
			//可以通过改变书库数据进而实现动态改变执行周期
			taskRegistrar.addTriggerTask(((Runnable)task),
				triggerContext -> {
					//可以使用持久层,比如Mybatis来实现,从数据库中获取
					String cronExpression = "0/10 * * * * ?";
					 return new CronTrigger(cronExpression).nextExecutionTime(triggerContext);
				}
			);
		}
	}

	@Bean
	public Executor taskExecutor(){
		return Executors.newScheduledThreadPool(10);
	}
}

分布式调度框架

分布式任务调度框架有:cronsun、Elastic-job、saturn、lts、TBSchedule、xxl-job 等。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络技术十五:DHCP

DHCP 引入原因&#xff08;产生背景&#xff09; 手动为局域网中大量主机配置IP地址、掩码、网关等参数的工作繁琐&#xff0c;容易出错 DHCP可以自动为局域网中主机完成TCP/IP协议配置 DHCP自动配置避免了IP地址冲突的问题 定义 动态主机配置协议 用于为局域网中主机动态分…

文件怎么加密?文件加密软件哪个好用?

在电脑中使用重要文件时&#xff0c;我们需要保护文件的安全&#xff0c;避免数据泄露&#xff0c;而保护文件最好的方法就是文件加密。那么&#xff0c;文件该怎么加密呢&#xff1f; 超级加密3000 文件加密的首要任务就是保护数据内容的安全性&#xff0c;我们需要选择拥有超…

有哪些跨平台的办公软件,可以集成到自己的 APP中?

随着移动办公的普及&#xff0c;越来越多的跨平台办公软件被开发出来以满足不断增长的移动办公需求。这些软件不仅可以在各种操作系统中运行&#xff0c;还可以集成到自己的APP中&#xff0c;进一步提升用户的工作效率。本文将介绍一些常用的跨平台办公软件&#xff0c;并探讨如…

科普初步了解大模型

目录 一、大模型的简单认知 &#xff08;一&#xff09;官方定义 &#xff08;二&#xff09;聚焦到大语言模型 &#xff08;三&#xff09;大模型的应用举例 二、如何得到大模型 &#xff08;一&#xff09;整体的一般步骤 训练自己的模型 使用预训练模型 选择适当的…

2023年13个面向初学者最佳免费3D建模软件

推荐&#xff1a;使用 NSDT场景编辑器 快速搭建3D应用场景 现在有数百种不同的免费 3D 建模软件工具供希望创建自己的 3D 模型的用户使用——因此知道从哪里开始可能会很棘手。 3D 软件建模工具的范围从即使是最新的初学者也易于使用到可能需要数年才能学习的专业级软件——因…

一键部署k8s集群

前置动作 关闭防火墙 systemctl disable firewalld && systemctl stop firewalld 关闭SELinux sed -i s#SELINUXenforcing#SELINUXdisabled#g /etc/selinux/config && grep SELINUXdisabled /etc/selinux/config setenforce 0 getenforce 关闭swap # 关闭…

Linux Kafka 3.5 KRaft模式集群部署

这里是weihubeats,觉得文章不错可以关注公众号小奏技术&#xff0c;文章首发。拒绝营销号&#xff0c;拒绝标题党 背景 kafka在KIP-500引入了KRaft替代Zookeeper来实现自我管理元数据 详细信息可以看原文链接 KIP-500 KRaft简介 KRaft是kafka用来取代zookeeper的分布式协调…

号外号外,桓峰基因单细胞生信分析免费培训课程即将开始,快来报名吧!

单细胞生信分析教程 桓峰基因公众号推出单细胞生信分析教程并配有视频在线教程&#xff0c;目前整理出来的相关教程目录如下&#xff1a; Topic 6. 克隆进化之 Canopy Topic 7. 克隆进化之 Cardelino Topic 8. 克隆进化之 RobustClone SCS【1】今天开启单细胞之旅&#xff0c;述…

FPGA实战小项目3

基于FPGA的波形发生器 基于FPGA的波形发生器 基于FPGA的beep音乐播放器设计 基于FPGA的beep音乐播放器设计 基于FPGA的cordic算法实现DDS sin和cosine波形的产生 基于FPGA的cordic算法实现DDS sin和cosine波形的产生

PY32F003F18端口复用功能映射

PY32F003F18端口复用功能映射&#xff0c;GPIO引脚可配置为"输入&#xff0c;输出,模拟或复用功能。 一、端口A复用功能映射 端口A复用功能映射表里&#xff0c;每个引脚都有AF0~AF15&#xff0c;修改AF0~AF15的值&#xff0c;就可以将对应复用用能引脚映射到CPU引脚上。…

【pthreads】支持vs2022构建

新增了一个vc16的目录 https://github.com/BrianGladman/pthreads/commit/60179353ef753ca171dee5199ec5fa54580835b0 官方已经支持直接支持v143 下载最新版,直接打开build.vs目录的sln vs 会提示安装python调试环境 安装过程自己失败取消了 再次打开就没弹出了。 直接构建静态…

2023全国大学生数学建模A题B题C题D题E题竞赛选题建议,思路模型

目录 国赛数学建模思路模型代码&#xff1a;9.7开赛后第一时间更新&#xff0c;完整思路获取见文末名片 一、题目选择 二、国赛摘要及论文写作技巧 1、国赛摘要 2、论文写作技巧 三、历年国赛真题及对应算法模型 完整国赛题思路模型获取见此 国赛数学建模思路模型代码&am…

企业架构LNMP学习笔记20

Nginx Location匹配规则&#xff1a; URI&#xff1a;统一资源标识符。 URN&#xff1a;统一资源名称。 URL&#xff1a;统一资源定位符。URL是更细化一点。 1&#xff09;精确匹配&#xff1a; location / {#规则 } 则匹配到 Example Domain 这种请求。 2&#xff09;~ 大…

RocketMQ consumer 和 queue 对应关系

参考 Consumer and Consumer Group Load Balancing https://rocketmq.apache.org/docs/4.x/consumer/01concept2 旧版本MQ结论 消费者应用和topic队列一对多的关系。 &#xff08;一个消费组consumer group里&#xff0c;一个消费者应用可以消费多个队列的消息。一个队列的消…

OpenMLDB 基于 Kubernetes 的部署全攻略

简介 Kubernetes 作为当前工业界流行的云原生容器编排和管理工具&#xff0c;在大量项目实践中被使用。目前&#xff0c;OpenMLDB 的离线引擎和在线引擎&#xff0c;均已经完整支持了基于 Kubernetes 的部署&#xff0c;可以实现更为方便的管理功能。本文将分别介绍离线和在线…

超级好用的10个思维导图模板

思维导图是一种非常有用的工具&#xff0c;可以被广泛应用于不同领域的人群。学生可以用思维导图来整理知识&#xff0c;老师可以用思维导图规划教学内容&#xff0c;设计课堂活动&#xff0c;还可以帮助学生梳理知识结构。各行各业的人都可以运用思维导图处理自己工作中的问题…

openWRT SFTP 远程文件传输

文章目录 前言 1. openssh-sftp-server 安装2. 安装cpolar工具3.配置SFTP远程访问4.固定远程连接地址 前言 本次教程我们将在OpenWRT上安装SFTP服务&#xff0c;并结合cpolar内网穿透&#xff0c;创建安全隧道映射22端口&#xff0c;实现在公网环境下远程OpenWRT SFTP&#xf…

如何阻止事件冒泡(event bubbling)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 原生 JavaScript⭐ jQuery⭐ React⭐Vue.js⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对…

龙蜥白皮书精选:龙蜥安全漏洞管理体系介绍

文/安全委员会 近日&#xff0c;龙蜥社区联合启明星辰、绿盟、360、阿里云、统信软件、浪潮信息、中兴通讯&#xff5c;中兴新支点、Intel、中科院软件所等 23 家单位正式成立了龙蜥社区安全联盟&#xff08;OASA&#xff0c;OpenAnolisSecurityAlliance&#xff09;。龙蜥社区…

解决charles只能使用30分钟

问题描述 Charles 30分钟会自动关闭&#xff0c;弹出一个弹窗。 解决步骤 1.网上查找后发现是需要注册一下。 2.打开Charles&#xff0c;如图的操作顺序 3.框内输入 Registered Name: https://zhile.io License Key: 48891cf209c6d32bf4 4.重启即可