ssm:spring定时任务Task和CronExpression表达式

news2025/1/12 20:52:56

开发一个定时任务:每天晚上23点执行数据归集任务

首先Spring配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="
          http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">

    <!-- 如下实现是通过线程池执行的 -->
    <task:executor id="executor" pool-size="10"/>
    <task:scheduler id="scheduler" pool-size="10"/>

    <!--&lt;!&ndash; 使用quartz执行任务调度 shiro也是使用它   &ndash;&gt;-->
    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" destroy-method='destroy'>
    <property name="triggers">
        <list>
            <!--数据归集-->
            <ref bean="autoPushSjgjTrigger"/>
        </list>
    </property>
    </bean>

    <!--数据归集定时任务  每天晚上23点获取一次 -->
    <bean id="autoPushSjgjTask" class="cn.zj.sjgj.sjgjtask.SjgjTaskService"/>
    <bean id="autoPushSjgjJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="autoPushSjgjTask"/>
        <property name="targetMethod" value="taskPush"/>
        <property name="concurrent" value="false"/>
    </bean>
 <!--触发器-->
    <bean id="autoPushSjgjTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="autoPushSjgjJob"></property>
        <property name="cronExpression" value="0 0 23 * * ?"/>
    </bean>
</beans>

然后是业务代码:

代码结构

 SjgjTaskService:

package cn.zj.sjgj.sjgjtask;


/**
 * @author zhoujing
 * @creatTime 2023-01-11
 * @description  定时任务
 */
@Service
@Slf4j
public class SjgjTaskService {

    @Autowired
    private XzjdSjgjService xzjdSjgjService;
    @Autowired
    private TPBidMapper bidMapper;

    public void taskPush(){
        log.info("【定时推送数据归集】定时任务开始!");
        pushData(1);
        log.info("【定时推送数据归集】定时任务结束!");
    }

    /**
     * @description: 推送数据归集
     * @author: zj
     * @createTime: 2023-01-11 10:29
     * @param: [type:1、当日;2、当月、3、当年]
     * @return: cn.zj.common.result.Result
     **/
    public Result pushData(int type) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            //默认查询当日需要归集的数据
            String stoday = sdf.format(new Date());
            if(type == 2){
                //查询当月需要归集的数据
                stoday = stoday.substring(0, 5);
            } else if(type == 3){
                //查询当年需要归集的数据
                stoday = stoday.substring(0, 8);
            }
            log.info("【定时推送数据归集】查询参数:" + stoday);
            //查询标段信息
            List<TPBid> bids = bidMapper.selectByUpdatetimeAndHistoryid(stoday);
           
            log.info("【定时推送数据归集】归集数据查询完毕,标段信息" + bids.size());
            log.info("推送标段开始....");
            bids.stream().forEach(bid ->{
                xzjdSjgjService.saveBdxx(bid); //具体业务逻辑处理方法
            });
            log.info("推送标段完成....");
           
            return Result.ok("归集数据查询完毕,标段信息" + bids.size() + "条");
        } catch (Exception e) {
            e.printStackTrace();
            return Result.fail(e.getLocalizedMessage());
        }
    }
}
SjgjTaskController 添加主动推送方法,定时任务有问题时调试方便
XzjdSjgjService 具体业务实现类就不写了
package cn.zj.sjgj.web;



/**
 * @author zj
 * @creatTime 2023-01-11
 * @description
 */
@Controller
public class SjgjTaskController {

    @Autowired
    private SjgjTaskService sjgjTaskService;

    @RequestMapping("/sjgj/pushData")
    @ResponseBody
    public Result pushDataSjgj(){
        return sjgjTaskService.pushData(2);
    }
}
Cron表达式:

Cron表达式是一个字符串,从Spring4.x版本后,不再进行年份的支持。该字符串以5个空格隔开,分为6个域,每一个域代表一个含义。语法如下:
  
  seconds minutes hours daysOfMonth months daysOfWeek

参数序号参数名含义允许的值允许的特殊字符
1Seconds0-59, - * /
2Minutes0-59, - * /
3Hours小时0-23, - * /
4Day-of-Month1-31, - * ? / L W C
5Month1-12 or JAN-DEC, - * /
6Day-of-Week周几1-7 or SUN-SAT, - * ? / L C #

例如:"0 0 12 ? * WED" 在每星期三下午 12:00 执行

其中每个元素可以是一个值 (6),一个连续区间 (9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符,由于月份中的日期和星期中的日期这两个元素互斥的,必须要对其中一个设置 

特殊字符说明

* : 可用在所有字段中,表示对应时间域的每一个时刻,例如,*在分钟字段时,表示“每分钟”;

?: 只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和 DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用*,如果使用*表示不管星期几都会触发,实际上并不是这样

-: 表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12;

,: 表达一个列表值,如在星期字段中使用“MON,WED,FRI”,则表示星期一,星期三和星期五;

/: x/y表达一个等步长序列,x为起始值,y为增量步长值。如在分钟字段中使用0/15,则表示为0,15,30和45秒,而5/15在分钟字段中表示5,20,35,50,你也可以使用*/y,它等同于0/y;

L:  该字符只在日期和星期字段中使用,代表“Last”的意思,但它在两个字段中意思不同。L在日期字段中,表示这个月份的最后一天,如一月的31号,非闰年二月的28号;如果L用在星期中,则表示星期六,等同于7。但是,如果L出现在星期字段里,而且在前面有一个数值 X,则表示“这个月的最后X天”,例如,6L表示该月的最后星期五;

W: 该字符只能出现在日期字段里,是对前导日期的修饰,表示离该日期最近的工作日。例如15W表示离该月15号最近的工作日,如果该月15号是星期六,则匹配14号星期五;如果15日是星期日,则匹配16号星期一;如果15号是星期二,那结果就是15号星期二。但必须注意关联的匹配日期不能够跨月,如你指定1W,如果1号是星期六,结果匹配的是3号星期一,而非上个月最后的那天。W字符串只能指定单一日期,而不能指定日期范围;

LW组合:在日期字段可以组合使用LW,它的意思是当月的最后一个工作日;

#:该字符只能在星期字段中使用,表示当月某个工作日。如6#3表示当月的第三个星期五(6表示星期五,#3表示当前的第三个),而4#5表示当月的第五个星期三,假设当月没有第五个星期三,忽略不触发;

C:该字符只在日期和星期字段中使用,代表“Calendar”的意思。它的意思是计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期。例如5C在日期字段中就相当于日历5日以后的第一天。1C在星期字段中相当于星期日后的第一天。
常见示例:

<!--每隔5秒执行一次  -->
<property name="cronExpression" value="*/5 * * * * ?"/>

<!--每隔1分钟执行一次  -->
<property name="cronExpression" value="0 */1 * * * ?"/>

<!--每天23点执行一次:  -->
<property name="cronExpression" value="0 0 23 * * ?"/>

<!-- 每天凌晨1点执行一次: -->
<property name="cronExpression" value="0 0 1 * * ?"/>

<!-- 每月1号凌晨1点执行一次: -->
<property name="cronExpression" value="0 0 1 1 * ?"/>

<!--每月最后一天23点执行一次:  -->
<property name="cronExpression" value="0 0 23 L * ?"/>

<!--每周星期天凌晨1点实行一次:  -->
<property name="cronExpression" value="0 0 1 ? * L"/>

<!--在26分、29分、33分执行一次:  -->
<property name="cronExpression" value="0 26,29,33 * * * ?"/>

<!-- 每天的0点、13点、18点、21点都执行一次: -->
<property name="cronExpression" value="0 0 0,13,18,21 * * ?"/>

<!-- 每天零点执行一次 -->
<property name="cronExpression" value="0 0 0 * * ?"/>

<!--每月的第三个星期五上午10:15触发  -->
<property name="cronExpression" value="0 15 10 ? * 6#3"/>

<!--周一至周五的上午10:15触发  -->
<property name="cronExpression" value="0 15 10 ? * MON-FRI"/>

<!--在每天下午2点到下午2:05期间的每1分钟触发  -->
<property name="cronExpression" value="0 0-5 14 * * ?"/>

<!--在每天下午2点到下午2:55期间的每5分钟触发  -->
<property name="cronExpression" value="0 0/5 14 * * ?"/>

<!--每天上午10:15触发  -->
<property name="cronExpression" value="0 15 10 * * ?"/>

<!--每年三月的星期三的下午2:10和2:44触发  -->
<property name="cronExpression" value="0 10,44 14 ? 3 WED"/>

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

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

相关文章

Java中的常用的代理模式

本文介绍在Java种常用的3种动态代理。 代理模式是23种模式中的一种&#xff0c;属于结构型设计模式。这种模式的作用就是要创建一个中间对象&#xff08;相当于中介或者代理对象&#xff09;&#xff0c;通过操作中间对象来间接调用目的对象的方法&#xff0c;字段等&#xff0…

Everything搜索知识总结

1.只知道那个文件以 .txt结尾 .*\.txt$ ($表示以什么结尾) 2.搜索某个路径下的文件 D:\ configure.bat (搜索D盘下的该文件,注意要用这种类型的"\",和被搜索的文件之间有空格;要先打出路径,再打出搜索文件.) 3.搜索指定路径下的多个文件 路径\ 文件1 | …

Halcon亚像素边缘缺陷检测案例

一、下面的案例是总结的Halcon边缘缺陷检测的一种情况。本案例是利用阈值分割获取金属区域&#xff0c;并利用boundary和edges_sub_pix获取到亚像素边缘。然后综合利用fit_rectangle2_contour_xld拟合出金属对应的放射矩形&#xff0c;最后利用dist_rectangle2_contour_points_…

【小白课程】openKylin用户手册原理解析,一招教你学会自定义!

openKylin用户手册是详细描述openKylin操作系统的功能和用户界面&#xff0c;让用户了解如何使用该软件的说明书。通过阅读openKylin用户手册&#xff0c;能够更快更好的上手和使用openKylin操作系统。今天就带大家简单了解下openKylin用户手册的实现原理以及如何自定义用户手册…

用EditPlus编译Fortran

一、EditPlus配置 语法点亮 安装好EditPlus后&#xff0c;点击Tool->Prefenrences&#xff0c;在File->Setting&syntex下&#xff0c;点击Add按钮&#xff0c;填Frotran。 到EditPlus官网上 EditPlus - User Files (other files) 下载Fortran语法文件 ​ 二、配置…

设计模式学习(四):Strategy策略模式

一、什么是Strategy模式 Strategy的意思是“策略”&#xff0c;指的是与敌军对垒时行军作战的方法。在编程中&#xff0c;我们可以将它理解为“算法”。无论什么程序&#xff0c;其目的都是解决问题。而为了解决问题&#xff0c;我们又需要编写特定的算法。使用Strategy模式可以…

Redis- 主从复制原理

1、概述 Master节点在平时提供服务&#xff0c;另外一个或多个Slave节点在平时不提供服务&#xff08;或只提供数据读取服务&#xff09;。当Master节点由于某些原因停止服务后&#xff0c;再人工/自动完成Slave节点到Master节点的切换工作&#xff0c;以便整个Redis集群继续向…

Spring依赖注入源码分析

1. 前言 Spring的核心之一就是依赖注入&#xff0c;Spring提供了Autowired注解来给bean注入依赖。除了注入最基本的bean之外&#xff0c;Spring还做了一些扩展&#xff0c;例如你可以注入Optional&#xff0c;以此来判断依赖的bean是否存在&#xff1b;你还可以注入Map来获得所…

Leetcode:617. 合并二叉树(C++)

目录 问题描述&#xff1a; 实现代码与解析&#xff1a; 递归&#xff1a; 原理思路&#xff1a; 迭代&#xff1a; 原理思路&#xff1a; 问题描述&#xff1a; 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&am…

leetcode 399. 除法求值-java题解

题目所属分类 flod最短路算法 原题链接 给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件&#xff0c;其中 equations[i] [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi values[i] 。每个 Ai 或 Bi 是一个表示单个变量的字符串。 另有一些以数组 queri…

编译metabase

Linux Centos7 配置Metabase编译打包环境 安装Oracle JDK1.8&#xff08;如果已经安装&#xff0c;则可以省略此步骤&#xff0c;必须是Oracle JDK&#xff09; 在线下载Oracle JDK 1.8 将下载好的tar包放入linux目录下 2、解压tar进行安装 tar -zxvf jdk-8u212-linux-x64.t…

SSL/TLS协议信息泄露漏洞(CVE-2016-2183)

最近服务器扫描出SSL/TLS协议信息泄露漏洞(CVE-2016-2183) TLS是安全传输层协议&#xff0c;用于在两个通信应用程序之间提供保密性和数据完整性。 TLS, SSH, IPSec协商及其他产品中使用的DES及Triple DES密码存在大约四十亿块的生日界&#xff0c;这可使远程攻击者通过Sweet…

总结几个常用的Git命令的使用方法

目录 1、Git的使用越来越广泛 2、设置Git的用户名和密码并查看 3、建立自己的 Git 仓库 4、将自己的代码提交到远程 (origin) 仓库 5、同步远程仓库的更新到本地仓库 6、分支管理 7、获取远程仓库的内容 1、Git的使用越来越广泛 现在很多的公司或者机构都在使用Git进行项目和代…

Elasticsearch基础1——搜索引擎发展史和工作流程、es\es-head\kibana的基础安装

文章目录一、搜索引擎1.1 搜索引擎的发展背景1.2 Lucene和Elasticsearch1.3 Solr和Elasticsearch对比1.4 数据搜索方式1.5 搜索引擎1.5.1 搜索引擎工作流程1.5.2 网络爬虫原理流程1.5.3 网页分析1.5.4 正排索引和倒排索引二、Elasticsearch基础安装1.2 概述简介2.2 安装2.2.1 W…

tensorflow算子注册以及op详解

在自定义的算子时&#xff0c;经常遇到一些函数和宏&#xff0c;这里介绍一下常见的函数和宏 REGISTER_OP 首先我们来思考REGISTER_OP的作用是什么&#xff1f;当我们定义一个tensorflow的算子&#xff0c;首先我们需要tensorflow知道这个算子&#xff0c;也就是说我们要把这…

WeLink的使用

我这里是注册的企业端 流程>手机号验证码 注册成功后登陆 进入首页面 按操作逐步完成信息需求 因个体使用情况不同 在角色分类和组织架构中可根据自己部门或单位的分工分类 【拉人】&#xff1a; 三种方式 主要就是网址超链接和企业码 前提需要用户先注册 【加入审核】是根…

Nginx——反向代理解决跨域问题(Windows)

这个破玩意是真麻烦&#xff0c;必须写一篇文章避避坑了。一、先看看大佬的解释&#xff0c;了解反向代理和跨域问题吧&#xff1a;Nginx反向代理什么是跨域问题二、OK&#xff0c;直接开工&#xff0c;装Nginx下载地址: http://nginx.org/en/download.html如图所示, 选择相应的…

Flink多流转换(Flink Stream Unoin、Flink Stream Connect、Flink Stream Window Join)

文章目录多流转换1、分流操作1.1、在flink 1.13版本中已弃用.split()进行分流1.2、使用&#xff08;process function&#xff09;的侧输出流&#xff08;side output&#xff09;进行分流2、基本合流操作2.1、联合&#xff08;Flink Stream Union&#xff09;2.2、连接&#x…

【Go】实操使用go连接clickhouse

前言 近段时间业务在一个局点测试clickhouse&#xff0c;用java写的代码在环境上一直连接不上clickhouse服务&#xff0c;报错信息也比较奇怪&#xff0c;No client available&#xff0c;研发查了一段时间没查出来&#xff0c;让运维这边继续查&#xff1a; 运维同学查了各种…

OAuth 2.0授权框架详解

简介 在现代的网站中&#xff0c;我们经常会遇到使用OAuth授权的情况&#xff0c;比如有一个比较小众的网站&#xff0c;需要用户登录&#xff0c;但是直接让用户注册就显得非常麻烦&#xff0c;用户可能因为这个原因而流失&#xff0c;那么该网站可以使用OAuth授权&#xff0…