【SpringTask】

由Spring提供的一个定时任务框架,之前有说到过Quartz,但是配置起来还是比较繁琐的

又或者是JDK自带的Timer,功能简单,但是处理不了复杂的定时任务

 

入门案例:

XML配置方式实现:

创建一个普通Maven项目

导入依赖坐标:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.2.9.RELEASE</version>
</dependency>

创建一个定时任务类:

package cn.zeal4j.task;

import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * @author Administrator
 * @file IntelliJ IDEA Spring-Task
 * @create 2020 09 22 9:58
 */
@Component
public class TaskJob {

    public void job01() {
        System.out.println("任务1" + new Date());
    }

    public void job02() {
        System.out.println("任务2" + new Date());
    }

}

配置SpringContext.xml

<?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:context="http://www.springframework.org/schema/context"
       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/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">


    <context:component-scan base-package="cn.zeal4j"/>

    <task:scheduled-tasks>
        <task:scheduled ref="taskJob" method="job01" cron="0/3 * * * * ?"/>
    </task:scheduled-tasks>
</beans>

获取bean运行就会触发定时任务,执行方法:

package cn.zeal4j;

import cn.zeal4j.task.TaskJob;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Hello world!
 *
 */
public class App {
    public static void main( String[] args ) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("app.xml");
        TaskJob taskJob = applicationContext.getBean("taskJob", TaskJob.class);
    }
}

注解方式实现:

注解驱动支持标签:

<task:annotation-driven />

之后不需要在XML配置,改用在方法上注解即可

package cn.zeal4j.task;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * @author Administrator
 * @file IntelliJ IDEA Spring-Task
 * @create 2020 09 22 9:58
 */
@Component
public class TaskJob {

    public void job01() {
        System.out.println("任务1" + new Date());
    }

    @Scheduled(cron = "0/5 * * * * ?")
    public void job02() {
        System.out.println("任务2" + new Date());
    }

}

运行没有变化,从容器中得到Bean实例即可执行定时任务

 

Cron表达式详细见Quartz的笔记:

https://www.cnblogs.com/mindzone/p/13657572.html

  

SpringBoot配置方式:

任务形式和上面的注解一样

package cn.ymcd.aisw.common.schedule;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * @projectName: aisw-root
 * @author: Cloud9
 * @date: 2022年05月25日 11:30
 * @version: 1.0
 */
@Component("taskJob")
public class Scheduler {

    @Scheduled(cron = "*/2 * * * * ?")
    public void job1() {
        System.out.println("测试 - 任务进行中。。。");
    }

}

 

但是需要在启动类注解 启用Task

package cn.ymcd.aisw;

import cn.ymcd.aisw.common.config.FileSettingConfig;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/***
 * 应用启动程序
 * @return
 * @author Cloud9
 * @createTime 2022/03/07 11:14
 */
@SpringBootApplication(scanBasePackages = "cn", exclude = {DynamicDataSourceAutoConfiguration.class})
@EnableScheduling
public class AiswEHotelBootApplication {
    public static void main(String[] args) {
        SpringApplication.run(AiswEHotelBootApplication.class, args);
    }
}

  

看我同事写是直接写了一个任务类

打上配置类注解和开启任务注解,来让Spring执行配置Bean,就不走启动类了

package cn.ymcd.aisw.schedule;

import cn.ymcd.aisw.merchant.service.IAiswMerchantService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;

import javax.annotation.Resource;

/**
 * @Description 商家管理定时任务
 * @Author jianglun
 * @Date 2022/5/19 0019 14:24
 * @Version 1.0
 */

@Configuration
@EnableScheduling
public class MerchantTask {

    private static final Logger LOGGER = LoggerFactory.getLogger(MerchantTask.class);

    @Autowired
    private IAiswMerchantService aiswMerchantService;

    /**
     * @description:定时过期商家,每天0点01分执行一次
     * @author: jianglun
     * @date: 2022/05/19 14:33
     * @return: void
     **/
    @Scheduled(cron = "${daily-validate.job-cron}")
    public void invalidMerchant(){
        try {
            LOGGER.info("开始执行商家过期任务");
            aiswMerchantService.invalidMerchant();
        } catch (Exception e){
            LOGGER.error("执行商家过期任务出错",e);
        } finally {
            LOGGER.info("商家过期任务结束");
        }
    }
}

 

 

多线程问题:

https://blog.csdn.net/weixin_44117767/article/details/119996464

  

 

posted @ 2020-09-22 10:21  emdzz  阅读(184)  评论(0)    收藏  举报