# Spring Boot 實(shí)戰(zhàn)系列 - 方法異步處理

一般在一個(gè)方法中需要處理多個(gè)任務(wù),其中某些任務(wù)無關(guān)緊要(如發(fā)送短信压状、記錄操作日志等)蚊荣,可以使用異步處理那些無關(guān)緊要的任務(wù),從而提高整個(gè)請(qǐng)求的相應(yīng)時(shí)間榔至。下面演示使用 Spring Boot 快速開發(fā)方法異步處理

pom.xml 依賴配置如下

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

Controller 層代碼

  • UserController 代碼如下
@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/users/{id}")
    public UserDTO get(@PathVariable("id") Long id) {
        return userService.getById(id);
    }
}

Service 層代碼

  • UserService 接口定義如下
// 接口定義
public interface UserService {

    UserDTO getById(Long id);
}
  • UserServiceImpl 實(shí)現(xiàn) UserService 接口,代碼如下
// 接口實(shí)現(xiàn)
@Slf4j
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private LogService logService;

    @Override
    public UserDTO getById(Long id) {

        log.info("查詢用戶");
        UserDTO userDTO = new UserDTO();
        userDTO.setId(id);

        log.info("記錄操作日志");
        logService.save();

        return userDTO;
    }
}
  • LogService 接口定義如下
// 接口定義
public interface LogService {

    void save();
}
  • LogServiceImpl 實(shí)現(xiàn) LogService 接口欺劳,代碼如下
// 接口實(shí)現(xiàn)
@Slf4j
@Service
public class LogServiceImpl implements LogService {

    @Async("logServiceExecutor") // @Async 表示該方法異步執(zhí)行唧取,"logServiceExecutor"用來指定線程池實(shí)例
    @Override
    public void save() {

        log.info("{},{},記錄日志, start", Integer.toHexString(Thread.currentThread().hashCode()), Thread.currentThread().getName());
        try {
            // 休眠3秒铅鲤,異步效果更明顯
            Thread.sleep(3000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        log.info("{},{},記錄日志, end.", Integer.toHexString(Thread.currentThread().hashCode()), Thread.currentThread().getName());
    }
}

配置層

  • 線程池配置代碼如下
@Slf4j
@EnableAsync
@Configuration
public class ExecutorConfig {

    @Bean("logServiceExecutor")
    public Executor logServiceExecutor() {

        log.info("啟動(dòng) Log Service Executor");

        ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 10,
                5L, TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(512),
                new CustomizableThreadFactory("save-log-thread-"),
                new ThreadPoolExecutor.DiscardPolicy());

        return executor;
    }
}

總結(jié)

  • 從代碼可以看出,一共增加了兩部分代碼
    • 1枫弟、線程池配置代碼(注意要加上 @EnableAsync 注解邢享,使異步生效)
    • 2、LogServiceImplsave 方法增加了 @Async("logServiceExecutor") 注解
  • 通過如上兩步媒区,簡單快捷實(shí)現(xiàn)方法異步處理驼仪,并且線程池與業(yè)務(wù)隔離

本文完。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末袜漩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子湾碎,更是在濱河造成了極大的恐慌宙攻,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件介褥,死亡現(xiàn)場離奇詭異座掘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)柔滔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門溢陪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人睛廊,你說我怎么就攤上這事形真。” “怎么了超全?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵咆霜,是天一觀的道長。 經(jīng)常有香客問我嘶朱,道長蛾坯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任疏遏,我火速辦了婚禮脉课,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘财异。我一直安慰自己倘零,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布宝当。 她就那樣靜靜地躺著视事,像睡著了一般。 火紅的嫁衣襯著肌膚如雪庆揩。 梳的紋絲不亂的頭發(fā)上俐东,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天跌穗,我揣著相機(jī)與錄音,去河邊找鬼虏辫。 笑死蚌吸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的砌庄。 我是一名探鬼主播羹唠,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼娄昆!你這毒婦竟也來了佩微?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤萌焰,失蹤者是張志新(化名)和其女友劉穎哺眯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扒俯,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奶卓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了撼玄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夺姑。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖掌猛,靈堂內(nèi)的尸體忽然破棺而出盏浙,到底是詐尸還是另有隱情,我是刑警寧澤留潦,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布只盹,位于F島的核電站,受9級(jí)特大地震影響兔院,放射性物質(zhì)發(fā)生泄漏殖卑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一坊萝、第九天 我趴在偏房一處隱蔽的房頂上張望孵稽。 院中可真熱鬧,春花似錦十偶、人聲如沸菩鲜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽接校。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蛛勉,已是汗流浹背鹿寻。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诽凌,地道東北人毡熏。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像侣诵,于是被迫代替她去往敵國和親痢法。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容