Scheduled定时器的用法

三种常用的Scheduled方法的表达式:cron,fixedDelay,fixedRate

注:使用此方法的类需要配置@Configuration,@EnableScheduling注解当然也可以开启其他注解,

使用@Scheduled标志的类其返回类型为void;

定时器执行任务

1.cron

//每隔20分钟执行一次此方法

@Scheduled(cron = “0 /20 ?”)

public void cornMethod(){

//log.info(“—-“)

}

2.fixedDelay

//每隔20分钟执行一次此方法,且在项目启动的时候会立马执行一次

@Scheduled(fixedDelay = 20 60 1000)

public void fixedDelayMethod(){

//log.info(“—-“)

}

3.fixedRate

//每隔20分钟执行一次此方法,且在项目启动的时候会立马执行一次,在每次调用的连续开始时间之间测量

public void fixedRateMethod(){

//log.info(“—-“)

}

异步执行任务

为什么要使用异步执行任务:当处理一个业务时业务符合某些条件时需要执行其他的步骤,但是这个步骤并不影响业务正常流程,这个时候就可以使用异步。

使用异步任务执行和使用上面的同步是同一个道理,同样需要配置相关的注解。

我们可以先配置一个异步线程池如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31


@Configuration
//开启异步任务执行注解
@EnableAsync
//开启同步任务执行注解(定时器)
@EnableScheduling
public class IdapAsyncConfigurer implements AsyncConfigurer {
//@使用@Asunc("eventThreadPoolTaskExecutor")标注类时使用下面的配置数据
@Bean("eventThreadPoolTaskExecutor")
public Executor eventThreadPoolTaskExecutor() {
return executor(5, 10, 20, 30);
}
//使用默认@Async标注类时使用下面的配置数据
@Override
public Executor getAsyncExecutor() {
return executor(10, 128, 256, 60);
}
private Executor executor(int coreSize, int maxSize, int queueSize, int keepAlive) {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(coreSize);
executor.setMaxPoolSize(maxSize);
executor.setQueueCapacity(queueSize);
executor.setKeepAliveSeconds(keepAlive);
executor.setThreadNamePrefix("async-executor-");
executor.initialize();
return executor;
}
}


  1. coreSize:核心线程大小
  2. maxSize:最大线程数
  3. queueSize: 队列大小(容量)
  4. keepAlive:线程存活时间
  5. queue-capacity还提供了一个值。还应根据执行者的队列容量来考虑线程池的配置。有关池大小和队列容量之间关系的完整说明,请参阅文档 ThreadPoolExecutor。主要思想是,在提交任务时,如果活动线程数当前小于核心大小,则执行程序首先尝试使用空闲线程。如果已达到核心大小,则只要尚未达到其容量,就将任务添加到队列中。只有这样,如果达到队列的容量,执行程序才创建超出核心大小的新线程。如果还达到了最大大小,那么执行者将拒绝该任务。
  6. keep-alive设置确定线程在终止之前可以保持空闲状态的时间限制(以秒为单位)。如果当前池中的线程数超过核心数,则在等待此时间而不处理任务后,多余的线程将被终止。时间值为零会导致多余的线程在执行任务后立即终止,而不会在任务队列中保留后续工作

一个的异步代码:

您可以@Async在方法上提供注释,以使该方法的调用异步发生。换句话说,调用方在调用后立即返回,而方法的实际执行发生在已提交给Spring的任务中TaskExecutor。在最简单的情况下

1
2
3
4
5
6
7
8
9


@Async("eventThreadPoolTaskExecutor")
public void SyncUpdateWxUserInfo(String param) {
log.info("在这个异步方法里面处理需要被处理的业务");

}


注:详情用法请参考官网:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/integration.html#scheduling-annotation-support-scheduled