功能实现篇(定时任务)--- 实现定时任务

C语言实现一个简单的多定时任务功能模块 一.简介 在项目开发中,很多功能模块都会用到定时功能,比如说定时3分钟后点亮一个led灯,定时1个小时后自动关机等,如果项目中只用到了一个应用层级别的定时功能,可能简单的写一下就好了,但是当项目中有多个定时功能需求的话,反而是把定时功能单独拿出来,写成一个功能模块,更简单更清晰。 二.功能实现 创建TimSet.c,TimSet.h,在TimSet.h文件中声明需要用的数据类型,及声明外部文件调用要用的api函数,在TimSet.c中实现api接口函数 2.1在头文件中定义数据类型 //枚举用到定时功能的模 阅读详情

目录

概述

书写定时任务的类

 XML里配置触发器Trigger

 XML里配置调度工厂Scheduler

 Cron表达式

Cron表达式例子


概述

    本文主要通过Spring和Quartz 实现定时任务

    Spring是一个开源框架,强大之处就不多说了

    Quartz是纯Java实现,而且是Spring的默认调度框架

    Quartz具有强大的调度功能、灵活的使用方式、还具有分布式集群能力

    可以说Quartz出马,可以搞定一切定时任务调度

    Quartz的体系结构

    Quartz有3个核心概念:调度器(Scheduler)、任务(Job&JobDetail)、触发器(Trigger)

  (一个任务可以被多个触发器触发,一个触发器只能触发一个任务)

书写定时任务的类

    可分为两种写法,继承QuartzJobBean和不继承的,二者仅编写定时任务类和xml配置作业类两步不同

    对于继承QuartzJobBean类的需要做:

  1.     需要实现定时任务的类继承org.springframework.scheduling.quartz.QuartzJobBean,实现定时执行的方法                          xml里要么声明这个定时任务类,要么使用注解扫描的方式声明
  2. xml里声明新的bean,class为org.springframework.scheduling.quartz.JobDetailBean
<bean name="job" class="org.springframework.scheduling.quartz.JobDetailBean">  
    <property name="jobClass" value="com.example.QuartzTimer" />  <!-- 指定定时任务类 -->
    <property name="jobDataAsMap"><!-- 为定时任务类注入属性,注意对应定时任务类,需要有属性的set方法 -->
    <map>
        <entry key="timeout" value="0" />  
    </map>  
    </property>  
</bean> 

    对于没继承QuartzJobBean类的需要做:

  1.  需要实现定时任务的类,主要是实现定时执行的方法
  2. xml里使用MethodInvokingJobDetailFactoryBean配置作业类
<bean id="job" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
    <property name="targetObject">  
        <bean class="com.example.QuartzTimer" />  <!-- 这个属性,指定定时任务类 -->
    </property>  
    <property name="targetMethod" value="doJob" />  
    <property name="concurrent" value="false" /><!-- 作业不并发调度 -->  
</bean>  

 XML里配置触发器Trigger

    触发器分为两种:

  1. org.springframework.scheduling.quartz.SimpleTriggerBean   只支持按频率触发,比如每隔多长时间执行一次
  2. org.springframework.scheduling.quartz.CronTriggerBean      支持使用Cron表达式,指定类似“在每几天的什么时间执行”的触发
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">  
    <property name="jobDetail" ref="job" />  
    <property name="startDelay" value="0" /><!-- 调度工厂实例化后,经过0秒开始执行调度 -->  
    <property name="repeatInterval" value="2000" /><!-- 每2秒调度一次 -->  
</bean> 

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">  
    <property name="jobDetail" ref="job" />  
    <!-- 每天12:00运行一次 -->  
    <property name="cronExpression" value="0 0 12 * * ?" />  
</bean> 

 XML里配置调度工厂Scheduler

    Scheduler是Quartz 调度程序的主要接口

    Scheduler维护了一个JobDetails 和Triggers的注册表

    一旦在Scheduler注册过了,当定时任务触发时间一到,调度程序就会负责执行预先定义的Job

<!-- 所有的触发器配到这里,由调度工厂统一调度 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
    <property name="triggers">
        <list>
            <ref bean="simpleTrigger"/>
            <ref bean="cronTrigger"/> 
        </list>  
    </property>  
</bean>  

 Cron表达式

字段允许值允许的特殊字符
秒  (Seconds)0~59的整数, - * /    四个字符
分   (Minutes)0~59的整数, - * /    四个字符
小时(Hours)0~23的整数, - * /    四个字符
日期(DayofMonth)1~31的整数(但是你需要考虑你月的天数),- * ? / L W C     八个字符
月份(Month)1~12的整数或者 JAN-DEC, - * /    四个字符
星期(DayofWeek)1~7的整数或者 SUN-SAT (1=SUN), - * ? / L C #     八个字符
年(可选,留空)(Year)1970~2099, - * /    四个字符

                                                         每一个域都使用数字,但还可以出现如下特殊字符

  1.    *:表示匹配该域的任意值。假如在Minutes域使用*, 即表示每分钟都会触发事件
  2.    ?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会
  3.    -:表示范围。例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次 
  4.    /:表示起始时间开始触发,然后每隔固定时间触发一次
  5.    ,:表示列出枚举值
  6.    L:表示最后,只能出现在DayofWeek和DayofMonth域
  7.    W:表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件
  8.    LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五
  9.    #:用于确定每个月第几个星期几,只能出现在DayofMonth域

Cron表达式例子

  • 0 0 2 1 * ? *   表示在每月的1日的凌晨2点调整任务
  • 0 15 10 ? * MON-FRI   表示周一到周五每天上午10:15执行作业
  • 0 15 10 ? 6L 2002-2006   表示2002-2006年的每个月的最后一个星期五上午10:15执行作
  • 0 0 10,14,16 * * ?   每天上午10点,下午2点,4点 
  • 0 0/30 9-17 * * ?   朝九晚五工作时间内每半小时 
  • 0 0 12 ? * WED    表示每个星期三中午12点 
  • 0 0 12 * * ?   每天中午12点触发 
  • 0 15 10 ? * *    每天上午10:15触发 
  • 0 15 10 * * ?     每天上午10:15触发 
  • 0 15 10 * * ? *    每天上午10:15触发 
  • 0 15 10 * * ? 2005    2005年的每天上午10:15触发 
  • 0 * 14 * * ?     在每天下午2点到下午2:59期间的每1分钟触发 
  • 0 0/5 14 * * ?    在每天下午2点到下午2:55期间的每5分钟触发 
  • 0 0/5 14,18 * * ?     在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
  • 0 0-5 14 * * ?    在每天下午2点到下午2:05期间的每1分钟触发 
  • 0 10,44 14 ? 3 WED    每年三月的星期三的下午2:10和2:44触发 
  • 0 15 10 ? * MON-FRI    周一至周五的上午10:15触发 
  • 0 15 10 15 * ?    每月15日上午10:15触发 
  • 0 15 10 L * ?    每月最后一日的上午10:15触发 
  • 0 15 10 ? * 6L    每月的最后一个星期五上午10:15触发 
  • 0 15 10 ? * 6L 2002-2005   2002年至2005年的每月的最后一个星期五上午10:15触发 
  • 0 15 10 ? * 6#3   每月的第三个星期五上午10:15触发
【SpringBoot 基础系列】实现一个简单的分布式定时任务(应用篇) 【SpringBoot 基础系列】实现一个简单的分布式定时任务(应用篇)在SpringBoot中,想使用定时器比较简单,一个注解@Scheduled配合上cron表达式即可支持各种定时任务了;单机任务还是比较简单的,但是当我们的服务有多个实例在运行时,如果只希望一个实例上的定时任务执行,可以怎么出了呢? 阅读详情

相关推荐

Django实现定时任务和邮件功能

文本初衷是为了实现在项目中设置定时任务,通过定时任务备份数据并发送到指定的邮箱中。

Mr数据杨 2万+

定时任务的实现原理:时间轮算法

前言 最近在思考实现定时任务的几种方式,比如 quartz,delay queue,scheduleThreadPool,时间轮。在对比的同时,也了解了下其简单原理,在这里描述下我对时间轮算法实现定时任务的理解。 时间轮定时使用方式 @Test public void test3() throws InterruptedException { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-d

苏苏爱自由 9082

【SpringBoot笔记16】SpringBoot集成Quartz实现定时任务功能

Quartz是一个实现定时任务的框架,它主要由三部分组成,分别是:Job任务、Trigger触发器、Scheduler调度器。Job任务:这是实际需要执行业务逻辑的方法,Quartz将其抽象成了一个Job对象。Trigger触发器:什么时候、什么条件下,应该执行Job任务呢,Quartz将其抽象成了一个Trigger对象。Scheduler调度器:当满足了执行条件时候,就要进行调度执行Job任务啦,Quartz将这个调度动作抽象成了一个Scheduler对象。

✅ Java 开发工程师 1284

定时任务原理方案综述

定时任务作为业务场景中不可或缺的一种通用能力,运用适合的定时任务能够快速解决业务问题,同时又能避免过度设计带来的资源浪费。本文旨在梳理目前定时任务的主流方案设计和原理,希望在读者在技术选型和方案重构时有所帮助,唯有落地推动业务的技术才有价值。技术永远不停变革,思考不能止步不前。转载:https://juejin.cn/post/7242333187250192443。

IT枫斗者的博客 1325

基于IC动态加权的机器学习多因子选股策略:从模型融合到实战回测

在量化投资领域,多因子选股模型通过挖掘市场数据中的有效信号来预测股票收益。其核心原理在于利用统计学与机器学习算法,从海量因子中识别出与未来收益具有稳定相关性的特征。这一技术的核心价值在于将主观投资决策转化为系统化、可重复的客观过程,从而在控制风险的前提下追求超额收益。其典型应用场景包括股票阿尔法策略构建、Smart Beta产品设计以及资产配置中的股票筛选环节。本文聚焦于如何通过信息系数(IC)这一关键指标,动态融合Ridge回归、MLP神经网络和随机森林等多个预测模型,构建一个能够自适应市场风格轮动的选股

weixin_34216614的博客 451

手把手教你用TJA1145A实现CAN节点智能唤醒(含数据帧过滤技巧)

本文详细介绍了如何使用TJA1145A收发器实现CAN节点的智能唤醒功能,包括数据帧过滤技巧和超低功耗设计。通过硬件级帧过滤和双条件唤醒机制,TJA1145A在保持微安级休眠电流的同时,能对特定报文做出毫秒级响应,显著提升电池供电设备的续航能力。

weixin_28721917的博客 249

Java 定时任务实现原理详解

在jdk自带的库中,有两种技术可以实现定时任务。一种是使用Timer,另外一个则是ScheduledThreadPoolExecutor。下面为大家分析一下这两个技术的底层实现原理以及各自的优缺点。 一、Timer 1. Timer的使用 class MyTask extends TimerTask{ @Override public void run() { ...

u013332124的专栏 5万+

Delphi 12社区版免费了!手把手教你搭建跨平台开发环境(Windows/macOS/Android/iOS)

本文详细介绍了如何利用新发布的Delphi 12社区版,免费搭建支持Windows、macOS、Android和iOS的跨平台开发环境。内容涵盖从环境准备、安装、配置各平台SDK(包括Android与macOS/iOS的PAServer连接),到创建首个FireMonkey跨平台应用、集成数据库以及调试部署的完整实战流程,帮助开发者零成本启动高效开发。

butter的博客 975

定时任务实现原理详解

一、摘要 在很多业务的系统中,我们常常需要定时的执行一些任务,例如定时发短信、定时变更数据、定时发起促销活动等等。 在上篇文章中,我们简单的介绍了定时任务的使用方式,不同的架构对应的解决方案也有所不同,总结起来主要分单机和分布式两大类,本文会重点分析下单机的定时任务实现原理以及优缺点,分布式框架的实现原理会在后续文章中进行分析。 从单机角度,定时任务实现主要有以下 3 种方案: while + sleep 组合 最小堆实现 时间轮实现 二、while+sleep组合 w

weixin_44593504的博客 6583

FPGA+滨淞CCD实战:手把手教你搭建S7031/S10142成像电路(附避坑指南)

本文详细介绍了使用FPGA驱动滨淞CCD传感器(S7031/S10142)构建高精度成像系统的完整实战流程。内容涵盖核心器件选型、系统架构规划、电路板(焦面板与接口板)设计要点、FPGA Verilog逻辑实现,并提供了从电源管理、信号调理到数据采集的详细避坑指南,帮助读者从零搭建稳定可靠的成像电路。

weixin_29271263的博客 227

手把手教你学simulink(69.3)--毫米波5G/6G 系统场景实例设计并实现基于Simulink的毫米波多用户MIMO通信系统模型

毫米波频段(30 GHz到300 GHz)因其高带宽和高速率特性,成为5G和未来6G通信系统的理想选择。然而,毫米波信号的传播特性较差,容易受到大气吸收、雨衰、建筑物遮挡等因素的影响。为了克服这些挑战并提高通信容量,多用户MIMO(MU-MIMO, Multi-User Multiple-Input Multiple-Output)技术被广泛应用。多用户MIMO技术通过在基站和多个用户之间同时传输多个数据流,充分利用空间资源,从而显著提升系统容量和频谱效率。

MHD0815的博客 493

定时任务详解

定时任务

qq_22162093的博客 1万+

SAP Parallel Accounting(平行分类账业务)配置及操作手册(超详细的说明和测试)

非常详细的介绍了SAP 的平行分类账配置以及测试效果哦

nopicture的博客 4341

【SpringBoot】Java使用Scheduled注解实现定时任务功能—基础篇

目录一、实现定时任务1. 创建项目2. 增加注解3. 创建定时任务二、配置详解三、定时任务cron表达式四、参考资料 一、实现定时任务 1. 创建项目 这里我们只需要引入web依赖即可。 修改配置文件,避免和本地其他项目端口冲突 2. 增加注解 启动类增加注解@EnableScheduling package com.example.scheduledemo; import org.springframework.boot.SpringApplication; import org.springfra

Code Metaverse 1944

【GRASS GIS零基础入门教程】2.1:初识GRASS GIS软件

GRASS GIS是一个强大的计算引擎,用于栅格、矢量和地理空间处理。它支持地形和生态系统建模、水文、数据管理和图像处理。通过内置的时态框架和Python API,它可以进行高级时间序列分析和快速地理空间编程,并针对各种硬件配置的大规模分析进行优化。

智慧空间实验室 847

【OpenFOAM】-olaFlow-算例1- baseWaveFlume

算例文件注释--olaFlow-算例1- baseWaveFlume

ou_no的博客 3639

功能篇:SpringBoot 实现静态、动态定时任务,本地动态定时任务调度

为了实现动态定时任务,你需要手动管理`ScheduledFuture`对象,这通常涉及到使用`TaskScheduler`接口提供的功能。在这个例子中,`addDynamicTask` 方法允许你根据传入的 `cronExpression` 和 `task` 来安排一个新的任务,而 `removeDynamicTask` 方法可以取消已有的任务。在Spring Boot中实现静态和动态定时任务可以通过使用`@Scheduled`注解来配置静态的调度任务,以及通过编程方式创建动态的调度任务。

qq_34207898的博客 748

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【Python脚本】定时任务脚本实现、自动关机等功能脚本实现(保姆篇)

这段代码利用多线程的方式提高了任务执行的效率,特别适合需要并发执行多个独立任务的场景,如发送多个通知或处理多个独立的数据处理任务。模块实现了根据时间注册和执行定时任务,并提供了实时的时间信息反馈和等待功能,使得任务的执行更加自动化和精确。它使用了多线程的方式,同时启动了多个线程来执行不同的任务,然后等待所有线程执行完毕后输出完成信息。这段代码的目的是确保输入数据的格式正确,以便后续的处理能够顺利进行。,用于检查输入数据的有效性。这段代码是一个并发执行多个任务的函数。,用于注册和执行定时任务。

A的博客 1992

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

2021.3.30C++学习笔记————条件变量实现定时任务

C++学习笔记————条件变量实现定时任务 近期部署的服务需要添加每隔十分钟轮询一次的功能,即定时任务,使用条件变量实现定时。 #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <string.h> #include <time.h> #include <iostream> #include <map> #include <set&g

CQ的学习笔记 489

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

mySql数据库新建定时任务步骤

mySql数据库新建定时任务步骤 这是我当初学习时记录下来的笔记,有些简陋还望勿怪! 步骤 1.选中数据库,新建一个函数,选择过程,完成。(根据需要可在“下一步”设置参数) 2.在这个过程体中写我们要执行的语句,然后保存。 3.选择事件,新建事件,调用函数。 4.在本页选择计划,选择EVERY,如下填写后保存: 说明: “1”表示执行一次,DAY表示执行单位,也就是一天执行一次。 start,end 顾名思义就是开始执行时间和结束时间。 5.查看EVENT进程是否开启:show variables

小灰灰的博客 722

netty心跳检测,定时任务

刚接触Netty,写的不好敬请谅解。 最近有一个需求,需要从客户端客户端定时的向服务器发送数据,通知服务器自己的一些状态信息,比如本地的cup使用率,内存使用率等信息,大体实现如下:   是用到了java提供的线程池,               newScheduledThreadPool:定长线程池,支持定时及周期性任务执行。 TestTask.java: public clas...

小梦_人生如戏的博客 3319

怎么实现一个点赞功能?

怎么实现一个点赞功能?

eeeeety6208的博客 686

Spring Boot 中实现定时任务(quartz)功能实战

通过以上步骤,我们成功地在 Spring Boot 中实现了定时任务的功能。使用 Spring Boot Starter Quartz 提供的依赖,我们可以方便地创建和管理定时任务。通过创建数据库表、编写实体类、DAO 层、Service 层和 Controller 层,我们实现了定时任务的增删改查功能。需要注意的是,定时任务的时间格式是。

m0_50308467的博客 2092

python实现定时任务的各种方法

python实现定时任务各种方法

y2016724的博客 3571

【开发篇】十五、Spring Task实现定时任务

上一篇用Quartz来实现了定时任务,但相对来说,这个框架还是比较繁琐。Spring Boot默认在无任何第三方依赖的情况下使用Spring-context模块下提供的定时任务工具。

llg___的博客 4985

Thinkphp6实现定时任务功能详解教程

前言 本文主要介绍命令启动定时任务的功能,按照CRMEB标准版的程序为大家详细的进行实现过程的介绍 一、首先创建安装Worker,执行composer require topthink/think-worker 安装 二、在config/console.php中定义指令 ‘timer’ => \crmeb\command\Timer::class 三、对应图1中的路径创建自定义指令crmeb\command\Timer.php 四、configure方法只要配置指令的内容,文件定义了一个timer的

CRMEB小程序商城的博客 9923
上一篇: 数据库篇(Oracle)---常用函数详解
下一篇: 工具篇(Java)--- 增量打包
Coder_Light
博客等级 码龄9年 30粉丝 24原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值