import org.slf4j.MDC;
import org.springframework.core.task.TaskDecorator;
import java.util.Map;
/**
*/
public class MdcTaskDecorator implements TaskDecorator {
/**
* 使异步线程池获得主线程的上下文
* @param runnable
* @return
*/
@Override
public Runnable decorate(Runnable runnable) {
Map<String,String> map = MDC.getCopyOfContextMap();
return () -> {
try{
MDC.setContextMap(map);
runnable.run();
} finally {
MDC.clear();
}
};
}
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.retry.support.RetryTemplate;
import org.springframework.scheduling.annotation.AsyncConfigurerSupport;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
/**
* @version 1.0
*/
@Configuration
public class AsyncConfig extends AsyncConfigurerSupport {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(16);// 核心线程池大小
threadPoolTaskExecutor.setMaxPoolSize(48);// 最大线程池大小
threadPoolTaskExecutor.setQueueCapacity(16);// 队列长度
threadPoolTaskExecutor.setThreadNamePrefix("Async-");// 线程前缀
threadPoolTaskExecutor.setTaskDecorator(new MdcTaskDecorator());// 设置任务装饰器
threadPoolTaskExecutor.initialize();
return threadPoolTaskExecutor;
}
/**
* 错误重试模板
* @return
*/
@Bean
public RetryTemplate retryTemplate() {
return new RetryTemplate();
}
}
//使用
import org.springframework.retry.support.RetryTemplate;
import java.util.concurrent.Executor;
class{
@Autowired
private RetryTemplate retryTemplate;
@Autowired
private Executor executor;
math(){
// (异步,并且失败重试3次)
executor.execute(() -> retryTemplate.execute(context ->
//操作
));
}
}