springboot使用@Async,和@Async整合線程池

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章