@Async使用,最好把线程放到单独的一个类中。
代码实现
用户登录异步写入登录日志。
1. 登录伪代码
/** 异步执行类 */
@Autowired
private AsyncLoginLogManage asyncLoginLogManage;
@Override
public BaseResponse<JSONObject> login(UserLoginDto userLoginDto) {
// 异步写入用户登录日志
asyncLoginLogManage.loginLog(userLoginDto.userId, "192.168.212.110", new Date(),
userToken, "PC", "windows 谷歌浏览器");
return setResultSuccess(resultJSON);
}
2. 异步执行
package com.mayikt.member.impl.manage;
import com.mayikt.member.impl.entitydo.UserLoginLogDo;
import com.mayikt.member.impl.mapper.UserLoginLogMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.util.Date;
/**
* @title: AsyncLoginLogManage 异步处理类
*/
@Component
@Slf4j
public class AsyncLoginLogManage {
@Autowired
private UserLoginLogMapper userLoginLogMapper;
/**
* 将用户登录日志写入数据库...
*/
@Async
public void loginLog(Long userId, String loginIp, Date loginTime, String loginToken, String channel,
String equipment) {
UserLoginLogDo userLoginLogDo = new UserLoginLogDo(userId, loginIp, loginTime, loginToken, channel, equipment);
log.info(Thread.currentThread().getName() + ",userLoginLogDo:" + userLoginLogDo.toString() + ",流程2");
userLoginLogMapper.insertUserLoginLog(userLoginLogDo);
log.info(Thread.currentThread().getName() + " 处理流程2");
}
}
3. 启动类注解
@EnableAsync
@Async整合线程池
async默认整合了线程次最多创建20个线程。
package com.mayikt.member.impl.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
/**
* @Async整合线程池
* 实现AsyncConfigurer即可
*/
@Configuration
public class MayiktTaskExecutorConfig implements AsyncConfigurer {
/**
* 设置ThreadPoolExecutor的核心池大小。
*/
private static final int CORE_POOL_SIZE = 2;
/**
* 设置ThreadPoolExecutor的最大池大小。
*/
private static final int MAX_POOL_SIZE = 2;
/**
* 设置ThreadPoolExecutor的BlockingQueue的容量。
*/
private static final int QUEUE_CAPACITY = 10;
/**
* 通过重写getAsyncExecutor方法,制定默认的任务执行由该方法产生
* <p>
* 配置类实现AsyncConfigurer接口并重写getAsyncExcutor方法,并返回一个ThreadPoolTaskExevutor
* 这样我们就获得了一个基于线程池的TaskExecutor
*/
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(CORE_POOL_SIZE);
taskExecutor.setMaxPoolSize(MAX_POOL_SIZE);
taskExecutor.setQueueCapacity(QUEUE_CAPACITY);
taskExecutor.initialize();
return taskExecutor;
}
}