SpringBoot異步調用 實現方式

我們在項目中,經常會遇到異步調用的問題,異步調用的效果就是主線程可以提前返回,然後交由任務子線程進行處理。在SpringBoot工程中,如何實現異步;簡單彙總了一下二種方法。

第一種:自定義線程類。

第二種:使用@Async和@EnableAsync註解;

一.自定義線程類

新建線程類實現Runnable接口:

Controller類中調用:

執行結果:

從結果中可以看出,Controller類的thread3方法執行時間間隔爲0秒,而ThreadTask類的run方法執行時間間隔爲3秒。和我們預期的相符。

二.使用@Async和@EnableAsync註解

第一步:首先使用@EnableAsync註解開啓異步調用功能

該註解可以放在以下幾個位置:

1:啓動類上方

@SpringBootApplication
@EnableAsync
public class SjcjApplication{
    public static void main(String[] args) {
        SpringApplication.run(SjcjApplication.class, args);
    }
}

2:當前需要執行異步調用的類上方

3:配置類上方使用

在SpringBoot中 該配置類不僅可以開啓異步調用開啓異步調用,我們還可以使用線程池對開啓的異步線程進行統一管理。

package com.inspur.tax.config;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

/**
* @ClassName TaskPoolConfig 
* @Description 線程池配置
* @author Tony
* @date 2020年3月14日 上午9:53:27 
* @version 1.0
 */
@EnableAsync
@EnableScheduling
@Configuration
public class TaskPoolConfig {

    @Bean(name = "taskPoolExecutor")
    public ThreadPoolExecutor getThreadPoolExecutor() {
        BlockingQueue<Runnable> bqueue = new ArrayBlockingQueue<Runnable>(20);
        ThreadPoolExecutor pool = new ThreadPoolExecutor(5,10,60, TimeUnit.MILLISECONDS,bqueue);
        pool.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

        return pool;
    }

    @Bean(name = "asyncPoolExecutor")
    public ThreadPoolTaskExecutor getAsyncThreadPoolTaskExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(5);
        taskExecutor.setMaxPoolSize(10);
        taskExecutor.setQueueCapacity(20);
        taskExecutor.setKeepAliveSeconds(12000);
        taskExecutor.setThreadNamePrefix("AsyncPool-");
        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        taskExecutor.setAwaitTerminationSeconds(60);
        taskExecutor.initialize();
        return taskExecutor;
    }

}

配置類中,如果不指定 Executor ,則默認使用 SimpleAsyncTaskExecutor。

新建TestAsyncService類,並在該類中新建serviceThread4方法,在serviceThread4方法上加@Async註解

然後在Controller調用:將TestAsyncService類注入到TestAsyncController類,並新建thread4方法,其中是調用taService.serviceThread4();異步方法。

執行結果:

 

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