@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;
}
}