国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

springboot異步調用@Async

gityuan / 1073人閱讀

摘要:異步處理方式調用之后,不返回任何數據。在有返回值的異步調用中,異步處理拋出異常,會直接拋出異常,異步任務結束,原有處理結束執行。

1.使用背景

在項目中,當訪問其他人的接口較慢或者做耗時任務時,不想程序一直卡在耗時任務上,想程序能夠并行執行,我們可以使用多線程來并行的處理任務,也可以使用spring提供的異步處理方式@Async。

2.異步處理方式

調用之后,不返回任何數據。

調用之后,返回數據,通過Future來獲取返回數據

3.@Async不返回數據

使用@EnableAsync啟用異步注解

@Configuration
@EnableAsync
@Slf4j
public class AsyncConfig{
}

在異步處理的方法dealNoReturnTask上添加注解@Async

@Component
@Slf4j
public class AsyncTask {

    @Async
    public void dealNoReturnTask(){
        log.info("Thread {} deal No Return Task start", Thread.currentThread().getName());
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("Thread {} deal No Return Task end at {}", Thread.currentThread().getName(), System.currentTimeMillis());
    }
}

Test測試類:

@SpringBootTest(classes = SpringbootApplication.class)
@RunWith(SpringJUnit4ClassRunner.class)
@Slf4j
public class AsyncTest {

    @Autowired
    private AsyncTask asyncTask;

    @Test
    public void testDealNoReturnTask(){
        asyncTask.dealNoReturnTask();
        try {
            log.info("begin to deal other Task!");
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

日志打印結果為:

begin to deal other Task!
AsyncExecutorThread-1 deal No Return Task start
AsyncExecutorThread-1 deal No Return Task end at 1499751227034

從日志中我們可以看出,方法dealNoReturnTask()是異步執行完成的。
dealNoReturnTask()設置sleep 3s是為了模擬耗時任務
testDealNoReturnTask()設置sleep 10s是為了確認異步是否執行完成

4.@Async返回數據

異步調用返回數據,Future表示在未來某個點獲取執行結果,返回數據類型可以自定義

    @Async
    public Future dealHaveReturnTask() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("thread", Thread.currentThread().getName());
        jsonObject.put("time", System.currentTimeMillis());
        return new AsyncResult(jsonObject.toJSONString());
    }

測試類用isCancelled判斷異步任務是否取消,isDone判斷任務是否執行結束

    @Test
    public void testDealHaveReturnTask() throws Exception {

        Future future = asyncTask.dealHaveReturnTask();
        log.info("begin to deal other Task!");
        while (true) {
            if(future.isCancelled()){
                log.info("deal async task is Cancelled");
                break;
            }
            if (future.isDone() ) {
                log.info("deal async task is Done");
                log.info("return result is " + future.get());
                break;
            }
            log.info("wait async task to end ...");
            Thread.sleep(1000);
        }
    }

日志打印如下,我們可以看出任務一直在等待異步任務執行完畢,用future.get()來獲取異步任務的返回結果

begin to deal other Task!
wait async task to end ...
wait async task to end ...
wait async task to end ...
wait async task to end ...
deal async task is Done
return result is {"thread":"AsyncExecutorThread-1","time":1499752617330}
4.異常處理

我們可以實現AsyncConfigurer接口,也可以繼承AsyncConfigurerSupport類來實現
在方法getAsyncExecutor()中創建線程池的時候,必須使用 executor.initialize(),
不然在調用時會報線程池未初始化的異常。
如果使用threadPoolTaskExecutor()來定義bean,則不需要初始化

@Configuration
@EnableAsync
@Slf4j
public class AsyncConfig implements AsyncConfigurer {

//    @Bean
//    public ThreadPoolTaskExecutor threadPoolTaskExecutor(){
//        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//        executor.setCorePoolSize(10);
//        executor.setMaxPoolSize(100);
//        executor.setQueueCapacity(100);
//        return executor;
//    }

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(100);
        executor.setQueueCapacity(100);
        executor.setThreadNamePrefix("AsyncExecutorThread-");
        executor.initialize(); //如果不初始化,導致找到不到執行器
        return executor;
    }
    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return new AsyncExceptionHandler();
    }
}

異步異常處理類:

@Slf4j
public class AsyncExceptionHandler implements AsyncUncaughtExceptionHandler {
    @Override
    public void handleUncaughtException(Throwable ex, Method method, Object... params) {
        log.info("Async method: {} has uncaught exception,params:{}", method.getName(), JSON.toJSONString(params));

        if (ex instanceof AsyncException) {
            AsyncException asyncException = (AsyncException) ex;
            log.info("asyncException:{}",asyncException.getErrorMessage());
        }

        log.info("Exception :");
        ex.printStackTrace();
    }
}

異步處理異常類:

@Data
@AllArgsConstructor
public class AsyncException extends Exception {
    private int code;
    private String errorMessage;
}

在無返回值的異步調用中,異步處理拋出異常,AsyncExceptionHandler的handleUncaughtException()會捕獲指定異常,原有任務還會繼續運行,直到結束。

在有返回值的異步調用中,異步處理拋出異常,會直接拋出異常,異步任務結束,原有處理結束執行。

大家可以關注我的公眾號:不知風在何處,相互溝通,共同進步。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67362.html

相關文章

  • springboot 異步調用

    摘要:異步程序在順序執行時,不等待異步調用的語句返回結果就執行后面的程序當一個異步過程調用發出后,調用者不能立刻得到結果。 同步 程序按照定義順序依次執行,每一行程序都必須等待上一行程序執行完成之后才能執行,就是在發出一個功能調用時,在沒有得到結果之前,該調用就不返回。 異步 程序在順序執行時,不等待異步調用的語句返回結果就執行后面的程序,當一個異步過程調用發出后,調用者不能立刻得到結果。 ...

    weij 評論0 收藏0
  • springboot 異步回調

    摘要:定義異步方法,使用來返回異步調用的結果開始做任務一完成任務一,當前線程,耗時毫秒任務一完成開始做任務二完成任務二,當前線程,耗時毫秒任務二完成開始做任務三完成任務三,當前線程,耗時毫秒任務三完成調用執行異步回調異步回調結束調用結果開 定義異步方法,使用Future來返回異步調用的結果 @Async public Future firstTask() throws Int...

    BingqiChen 評論0 收藏0
  • Springboot對多線程的支持詳解

    摘要:對多線程的支持詳解這兩天看阿里的開發手冊,到多線程的時候說永遠不要用這種方式來使用多線程。在使用線程池的大多數情況下都是異步非阻塞的。二配置類配置類代碼如下下午解讀利用來開啟對于異步任務的支持配置類實現接口,返回一個線程池對象。 Springboot對多線程的支持詳解 這兩天看阿里的JAVA開發手冊,到多線程的時候說永遠不要用 new Thread()這種方式來使用多線程。確實是這樣的...

    adie 評論0 收藏0
  • springboot配置線程池使用多線程插入數據

    摘要:最開始是使用的正常的普通方式去寫入,但是量太大了,所以就嘗試使用多線程來寫入。下面我們就來介紹一下怎么使用多線程進行導入。配置線程池我們需要創建一個類來設置線程池的各種配置。它可以使主線程一直等到所有的子線程執行完之后再執行。 前言: 最近在工作中需要將一大批數據導入到數據庫中,因為種種原因這些數據不能使用同步數據的方式來進行復制,而是提供了一批文本,文本里面有很多行url地址,需要的...

    wenshi11019 評論0 收藏0

發表評論

0條評論

gityuan

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<