日常提交

This commit is contained in:
wu xiangkai
2023-01-06 13:00:20 +08:00
parent 4bbb9e44cf
commit 53cce93ee0

View File

@@ -98,3 +98,85 @@ scheduler.schedule(task, new CronTrigger("0 15 9-17 * * MON-FRI"));
Spring的另一个Trigger实现是PeriodicTrigger其接受一个固定的period期间一个可选的初始delay值并接收一个boolean值标识该period是fixed-rate还是fixed-delay。 Spring的另一个Trigger实现是PeriodicTrigger其接受一个固定的period期间一个可选的初始delay值并接收一个boolean值标识该period是fixed-rate还是fixed-delay。
### TaskScheduler实现类 ### TaskScheduler实现类
如果不需要外部的线程管理可以使用spring提供的ThreadPoolTaskScheduler其会将任务委托给ScheduledExecutorService来提供bean-properties形式的配置。 如果不需要外部的线程管理可以使用spring提供的ThreadPoolTaskScheduler其会将任务委托给ScheduledExecutorService来提供bean-properties形式的配置。
## 对任务调度和异步执行的注解支持
Spring同时对任务调度和异步方法的执行提供注解支持。
### 启用Scheduling注解
想要启用@Async和@Scheduled注解,必须将@EnableAsync注解和@EnableScheduling注解添加到一个@Configuration类上
```java
@Configuration
@EnableAsync
@EnableScheduling
public class AppConfig {
}
```
> **@Async注解的实现是通过proxy模式来实现的故而如果在类内部调用位于同一个类中的@Async方法那么代理拦截会失效此时调用的@Async方法将会同步执行而非异步执行**
> @Async可以接收一个value值用于指定目标的执行器Executor或TaskExecutor的beanName
### @Scheduled注解
在将@Scheduled注解标注到方法时可以为其指定一个trigger的元数据使用示例如下
```java
@Scheduled(fixedDelay = 5000)
public void doSomething() {
// something that should run periodically
}
```
> 默认情况下fixedDelay、fixedRate、initialDelay的时间单位都是ms可以指定timeUnit来指定其他的时间单位
> ```java
> @Scheduled(fixedDelay = 5, timeUnit = TimeUnit.SECONDS)
> public void doSomething() {
> // something that should run periodically
> }
> ```
可以为@Scheduled注解使用cron表达式
```java
@Scheduled(cron="*/5 * * * * MON-FRI")
public void doSomething() {
// something that should run on weekdays only
}
```
### @Async注解
通过为方法指定@Async注解可以让该方法异步执行该方法的执行通过TaskExecutor。
```java
@Async
void doSomething() {
// this will be run asynchronously
}
```
可以为@Async标注的方法指定参数和返回值但是异步方法的返回值只能为void或是Future类型。
在该异步方法的调用方调用返回Future实例的get方法之前调用方仍然能够执行其他操作异步方法的执行位于TaskExecutor的线程中。
```java
@Async
Future<String> returnSomething(int i) {
// this will be run asynchronously
}
```
不能将@Async注解和生命周期回调(例如@PostConstruct进行混用如果想要异步的初始化bean对象需要按照如下方法
```java
public class SampleBeanImpl implements SampleBean {
@Async
void doSomething() {
// ...
}
}
public class SampleBeanInitializer {
private final SampleBean bean;
public SampleBeanInitializer(SampleBean bean) {
this.bean = bean;
}
@PostConstruct
public void initialize() {
bean.doSomething();
}
}
```