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

开发一个定时任务:每天晚上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, 4);
            } else if(type == 3){
                //查询当月需要归集的数据
                stoday = stoday.substring(0, 7);
            }
            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"/>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SSM项目中使用Quartz进行定时任务可以按照以下步骤进行操作: 1. 配置依赖:在项目的`pom.xml`文件中添加Quartz的依赖。例如: ```xml<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency> ``` 2. 创建定时任务类:在您的SSM项目中创建一个定时任务类,可以命名为`JobScheduleTask`。该类需要实现Quartz的`Job`接口,并实现其中的`execute`方法。在`execute`方法中编写定时任务的逻辑代码。 ```javapublic class JobScheduleTask implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 定时任务的逻辑代码 // ... } } ``` 3. 配置定时任务触发器:创建一个触发器类,可以命名为`JobScheduleTrigger`。在该类中,使用Quartz的`TriggerBuilder`来配置定时任务触发器的属性,例如执行时间、周期等。 ```javapublic class JobScheduleTrigger { public static Trigger createTrigger() { return TriggerBuilder.newTrigger() .withIdentity("jobScheduleTrigger") .withSchedule(CronScheduleBuilder.cronSchedule("000/1 * * ?")) // 每小时执行一次 .build(); } } ``` 4. 配置定时任务调度器:创建一个调度器类,可以命名为`JobScheduleScheduler`。在该类中,使用Quartz的`SchedulerFactory`来创建调度器实例,并配置相关属性,如数据源、任务存储等。然后使用调度器的`scheduleJob`方法将定时任务和触发器关联起来,并启动调度器。 ```javapublic class JobScheduleScheduler { public static void startScheduler() throws SchedulerException { SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); JobDetail jobDetail = JobBuilder.newJob(JobScheduleTask.class) .withIdentity("jobScheduleTask") .build(); Trigger trigger = JobScheduleTrigger.createTrigger(); scheduler.scheduleJob(jobDetail, trigger); scheduler.start(); } } ``` 5. 在Spring配置文件中配置调度器:在您的Spring配置文件(如`applicationContext.xml`)中,将定时任务调度器配置为一个Bean,并在其中调用`JobScheduleScheduler.startScheduler()`方法。 ```xml<bean id="jobScheduleScheduler" class="com.example.JobScheduleScheduler" init-method="startScheduler" /> ``` 6. 启动项目:启动您的SSM项目,定时任务调度器会根据配置的触发器时间和周期执行定时任务的逻辑。 请注意,以上步骤仅提供了一个基本示例,您可以根据实际需求进行修改和扩展。希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值