# scaffold 项目之异步任务

# 简介

其实就是非阻塞的执行代码

在之前的 scaffold-spring-boot-starter-job 技术组件,除了提供定时任务的功能,还提供了 Async 异步任务的能力。系统使用异步任务,提升执行效率。例如说:

操作日志模块 ,异步记录【操作日志】

访问日志模块 ,异步记录【访问日志】

# 开始使用

# Async 配置

ScaffoldAsyncAutoConfiguration 配置类,设置使用 TransmittableThreadLocal,解决异步执行时上下文传递的问题。

@AutoConfiguration
@EnableAsync
public class ScaffoldAsyncAutoConfiguration {
    @Bean
    public BeanPostProcessor threadPoolTaskExecutorBeanPostProcessor() {
        return new BeanPostProcessor() {
            @Override
            public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
                if (!(bean instanceof ThreadPoolTaskExecutor)) {
                    return bean;
                }
                // 修改提交的任务,接入 TransmittableThreadLocal
                ThreadPoolTaskExecutor executor = (ThreadPoolTaskExecutor) bean;
                executor.setTaskDecorator(TtlRunnable::get);
                return executor;
            }
        };
    }
}

说明:

@EnableAsync: 开启 spring Async 功能

executor.setTaskDecorator (TtlRunnable::get);: 设置任务执行器,指定要应用于任何即将执行的 Runnable 的自定义 TaskDecorator

# 引入依赖

<dependency>
    <groupId>com.tz.boot</groupId>
    <artifactId>scaffold-spring-boot-starter-job</artifactId>
</dependency>

# 添加 @Async 注解使用

在要异步执行的方法上添加 @Async 注解

// 异步插入操作日志
@Async
public void createOperateLog(OperateLog operateLog) {
    OperateLogCreateReqDTO reqDTO = BeanUtil.copyProperties(operateLog, OperateLogCreateReqDTO.class);
    operateLogApi.createOperateLog(reqDTO);
}