1、SpringBoot异步调用
@EnableAsync @Async
2、SpringBoot全局异常使用
@ControllerAdvice 定义全局异常处理类 @ExceptionHandler 用于定义函数针对的异常类型
3、SpringBoot重试机制
@EnableRetry @Retryable
4、SpringBoot拦截器
自定义实现HandlerInterceptor类的注入Spring容器中,preHandle、postHandle、afterCompletion。
5、SpringBoot 定时器。
1、SpringBoot内置的定时
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
启动类添加注解
@SpringBootApplication
@EnableScheduling
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
创建定时任务
方式一、
@Component
public class SchedulerTask01 {
private int count = 0;
/**
* @Description 设置没5秒执行一次
* @Param
* @return void
**/
@Scheduled(cron = "*/5 * * * * ?")
private void process() {
System.out.println("SchedulerTask01: is scheduler task running " + (count++));
}
}
方式二、
@Component
public class SchedulerTask02 {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
/**
* @Description 设置每3秒执行一次
**/
@Scheduled(fixedRate = 3000)
private void process() {
System.out.println("SchedulerTask02: now time is " + dateFormat.format(new Date()));
}
}
参数说明
@Scheduled 参数可以接受两种定时的设置,一种是我们常用的 cron="*/5 * * * * ?",一种是 fixedRate = 3000,两种都可表示固定周期执行定时任务。
fixedRate说明
- @Scheduled(fixedRate = 3000):上一次开始执行时间点之后 3 秒再执行。
- @Scheduled(fixedDelay = 3000):上一次执行完毕时间点之后 3 秒再执行。
- @Scheduled(initialDelay=1000, fixedRate=3000):第一次延迟 1 秒后执行,之后按 fixedRate 的规则每 3秒执行一次
cron 略
2、Quartz
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
定义一个Job
@Data
public class SampleJob extends QuartzJobBean {
private String name;
private int age;
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) {
System.out.println("QuartzJobBean-SampleJob-Quartz ----> Hi, " + this.name + "---->" + this.age);
}
}
构建JobDetail
@Configuration
public class SampleScheduler {
// 链式编程,可以携带多个参数,在Job类中声明属性 + setter方法
@Bean
public JobDetail sampleJobDetail() {
return JobBuilder.newJob(SampleJob.class).withIdentity("sampleJob")
.usingJobData("name", "World").
usingJobData("age", 28).storeDurably().build();
}
// 每隔两秒执行一次
@Bean
public Trigger sampleJobTrigger() {
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever();
return TriggerBuilder.newTrigger().forJob(sampleJobDetail()).withIdentity("sampleTrigger").withSchedule(scheduleBuilder).build();
}
}
JobBuilder 无构造函数,只能通过 JobBuilder 的静态方法 newJob(Class jobClass)生成 JobBuilder 实例。withIdentity 方法可以传入两个参数 withIdentity(String name,String group) 来定义 TriggerKey,也可以不设置,例如上文示例中会自动生成一个独一无二的 TriggerKey 用来区分不同的 Trigger。
3、CronSchedule方式
定义两个Job
@Data
public class ScheduledJob01 implements Job {
private String name;
@Override
public void execute(JobExecutionContext jobExecutionContext) {
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
System.out.println("ScheduledJob01: " + name + " ----> " + dateFormat.format(new Date()));
}
}
@Data
public class ScheduledJob02 implements Job {
private String name;
@Override
public void execute(JobExecutionContext jobExecutionContext) {
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
System.out.println("ScheduledJob02: " + name + " ----> " + dateFormat.format(new Date()));
}
}
构建Schedule来执行任务
@Component
public class CronSchedulerJob {
@Autowired
private SchedulerFactoryBean schedulerFactoryBean;
// 6的倍数秒执行 即 6 12 18 24 30 36 42 ....
private void scheduleJob1(Scheduler scheduler) throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(ScheduledJob01.class).withIdentity("job1", "group1").build();
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/6 * * * * ?");
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
.usingJobData("name", "zbx001").withSchedule(scheduleBuilder).build();
scheduler.scheduleJob(jobDetail, cronTrigger);
}
// 12秒的倍数执行 即 12 24 36 48 60
private void scheduleJob2(Scheduler scheduler) throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(ScheduledJob02.class).withIdentity("job2", "group2").build();
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/12 * * * * ?");
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger2", "group2")
.usingJobData("name", "zbx002").withSchedule(scheduleBuilder).build();
scheduler.scheduleJob(jobDetail, cronTrigger);
}
/**
* @return void
* @Description 同时启动两个定时任务
**/
public void scheduleJobs() throws SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
scheduleJob1(scheduler);
scheduleJob2(scheduler);
}
}
触发定时任务有两种方式:两种启动方案,在项目中选择一种使用即可,否则会导致重复启动定时任务而报错。 所以在测试某一个启动时,将另一个类上的注解注释掉就可以了。
方式一:
@Configuration
@EnableScheduling
@Component
public class SchedulerListener {
@Autowired
public CronSchedulerJob scheduleJobs;
@Scheduled(cron="0 47 16 24 1 ?")
public void schedule() throws SchedulerException {
scheduleJobs.scheduleJobs();
System.out.println(">>>>>>>>>>>>>>>定时任务开始执行-0001<<<<<<<<<<<<<");
}
}
方式二:
@Component
public class MyStartupRunner implements CommandLineRunner {
@Autowired
public CronSchedulerJob scheduleJobs;
@Override
public void run(String... args) throws Exception {
scheduleJobs.scheduleJobs();
System.out.println(">>>>>>>>>>>>>>>定时任务开始执行-0002<<<<<<<<<<<<<");
}
}
6、SpringBoot ShardJDBC
未完待续。。。