文章目录

1. 启动类添加@EnableAsync注解
package com.gblfy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

@EnableAsync
@SpringBootApplication
public class JavaEscapeApplication {

public static void main(String[] args) {
SpringApplication.run(JavaEscapeApplication.class, args);
}

}
2. 异步方法添加@Async注解
package com.gblfy.async_task;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Service;

import java.util.concurrent.Future;

@Slf4j
@Service
public class AsyncService {

@Async
public void asyncProcess01() throws Exception {
log.info("AsyncService Start to asyncProcess01 ->{}", Thread.currentThread().getName());
Thread.sleep(2000);
log.info("AsyncService Start to asyncProcess01 ->{}", Thread.currentThread().getName());
}

@Async
public Future<String> asyncProcess02() throws Exception {
log.info("AsyncService Start to asyncProcess02->{}", Thread.currentThread().getName());
Thread.sleep(2000);
log.info("AsyncService Done to asyncProcess02->{}", Thread.currentThread().getName());
return new AsyncResult<>("imooc");
}

@Async
public void asyncProcess03() {
log.info("AsyncService Start to asyncProcess03->{}", Thread.currentThread().getName());
throw new RuntimeException("throw exception asyncProcess03");
}
}
3. 自定义线程池以及线程池异常策略
package com.gblfy.async_task;

import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

/**
* 自定义异步任务线程池
*/
@Slf4j
@Configuration
public class AsyncTaskConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {

ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setThreadNamePrefix("cmiip-");
executor.setCorePoolSize(15);
executor.setMaxPoolSize(20);
executor.setKeepAliveSeconds(5);
executor.setQueueCapacity(100);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());

executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(60);
executor.initialize();
return executor;
}

@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new AsyncUncaughtExceptionHandler() {
@Override
public void handleUncaughtException(Throwable ex, Method method, Object... params) {
// 报警邮件,发短信等等
log.error("async task some Error: {} ,{} , {}", ex.getMessage(),
method.getDeclaringClass().getName() + "." + method.getName(),
Arrays.toString(params));
}
};
}
}

测试

package com.gblfy.async_task;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

@Slf4j
@SpringBootTest
class AsyncServiceTest {


@Autowired
private AsyncService asyncService;

@Test
void contextLoads() throws Exception {
// asyncService.asyncProcess01();
Future<String> future= asyncService.asyncProcess02();
log.info("Async Process02 return :->{}", future.get(1, TimeUnit.SECONDS));
}

@Test
void contextLoads2() throws Exception {
asyncService.asyncProcess03();
Thread.sleep(3000);
}
}