【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

浙公网安备 33010602011771号