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

資訊專欄INFORMATION COLUMN

Spring Boot 異步執(zhí)行方法

jiekechoo / 3357人閱讀

摘要:最近遇到一個需求,就是當(dāng)服務(wù)器接到請求并不需要任務(wù)執(zhí)行完成才返回結(jié)果,可以立即返回結(jié)果,讓任務(wù)異步的去執(zhí)行。指定從上面執(zhí)行的日志可以猜測到默認使用來異步執(zhí)行任務(wù)的,可以搜索到這個類。

最近遇到一個需求,就是當(dāng)服務(wù)器接到請求并不需要任務(wù)執(zhí)行完成才返回結(jié)果,可以立即返回結(jié)果,讓任務(wù)異步的去執(zhí)行。開始考慮是直接啟一個新的線程去執(zhí)行任務(wù)或者把任務(wù)提交到一個線程池去執(zhí)行,這兩種方法都是可以的。但是 Spring 這么強大,肯定有什么更簡單的方法,就 google 了一下,還真有呢。就是使用 @EnableAsync@Async 這兩個注解就 ok 了。
給方法加上 @Async 注解
package me.deweixu.aysncdemo.service;

public interface AsyncService {

    void asyncMethod(String arg);
}
package me.deweixu.aysncdemo.service.ipml;

import me.deweixu.aysncdemo.service.AsyncService;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class AsyncServiceImpl implements AsyncService {

    @Async
    @Override
    public void asyncMethod(String arg) {
        System.out.println("arg:" + arg);
        System.out.println("=====" + Thread.currentThread().getName() + "=========");
    }
}
@EnableAsync

在啟動類或者配置類加上 @EnableAsync 注解

package me.deweixu.aysncdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

@EnableAsync
@SpringBootApplication
public class AysncDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(AysncDemoApplication.class, args);
    }
}
測試
package me.deweixu.aysncdemo;

import me.deweixu.aysncdemo.service.AsyncService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class AysncDemoApplicationTests {

    @Autowired
    AsyncService asyncService;

    @Test
    public void testAsync() {
        System.out.println("=====" + Thread.currentThread().getName() + "=========");
        asyncService.asyncMethod("Async");
    }

}
=====main=========
2018-03-25 21:30:31.391  INFO 28742 --- [           main] .s.a.AnnotationAsyncExecutionInterceptor : No task executor bean found for async processing: no bean of type TaskExecutor and no bean named "taskExecutor" either
arg:Async
=====SimpleAsyncTaskExecutor-1=========

從上面的結(jié)果看 asyncService.asyncMethod("Async") 確實異步執(zhí)行了,它使用了一個新的線程。

指定 Executor

從上面執(zhí)行的日志可以猜測到 Spring 默認使用 SimpleAsyncTaskExecutor 來異步執(zhí)行任務(wù)的,可以搜索到這個類。@Async 也可以指定自定義的 Executor

在啟動類中增加自定義的 Executor
package me.deweixu.aysncdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;

@EnableAsync
@SpringBootApplication
public class AysncDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(AysncDemoApplication.class, args);
    }

    @Bean(name = "threadPoolTaskExecutor")
    public Executor threadPoolTaskExecutor() {
        return new ThreadPoolTaskExecutor();
    }
}
指定 Executor
package me.deweixu.aysncdemo.service.ipml;

import me.deweixu.aysncdemo.service.AsyncService;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class AsyncServiceImpl implements AsyncService {

    @Async("threadPoolTaskExecutor")
    @Override
    public void asyncMethod(String arg) {
        System.out.println("arg:" + arg);
        System.out.println("=====" + Thread.currentThread().getName() + "=========");
    }
}

這樣在異步執(zhí)行任務(wù)的時候就使用 threadPoolTaskExecutor

設(shè)置默認的 Executor

上面提到如果 @Async 不指定 Executor 就默認使用 SimpleAsyncTaskExecutor,其實默認的 Executor 是可以使用 AsyncConfigurer 接口來配置的

@Configuration
public class SpringAsyncConfig implements AsyncConfigurer {
     
    @Override
    public Executor getAsyncExecutor() {
        return new ThreadPoolTaskExecutor();
    }
     
}
異常捕獲

在異步執(zhí)行的方法中是可能出現(xiàn)異常的,我們可以在任務(wù)內(nèi)部使用 try catch 來處理異常,當(dāng)任務(wù)拋出異常時,Spring 也提供了捕獲它的方法。

實現(xiàn) AsyncUncaughtExceptionHandler 接口

public class CustomAsyncExceptionHandler
  implements AsyncUncaughtExceptionHandler {
 
    @Override
    public void handleUncaughtException(
      Throwable throwable, Method method, Object... obj) {
  
        System.out.println("Exception message - " + throwable.getMessage());
        System.out.println("Method name - " + method.getName());
        for (Object param : obj) {
            System.out.println("Parameter value - " + param);
        }
    }
     
}

實現(xiàn) AsyncConfigurer 接口重寫 getAsyncUncaughtExceptionHandler 方法

@Configuration
public class SpringAsyncConfig implements AsyncConfigurer {
     
    @Override
    public Executor getAsyncExecutor() {
        return new ThreadPoolTaskExecutor();
    }
    
    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return new CustomAsyncExceptionHandler();
    }

     
}

改寫 asyncMethod 方法使它拋出異常

    @Async
    @Override
    public void asyncMethod(String arg) {
        System.out.println("arg:" + arg);
        System.out.println("=====" + Thread.currentThread().getName() + "=========");
        throw new NullPointerException();
    }

運行結(jié)果:

=====main=========
arg:Async
=====threadPoolTaskExecutor-1=========
Exception message - Async NullPointerException
Method name - asyncMethod
Parameter value - Async

正確捕獲到了異常。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/71008.html

相關(guān)文章

  • Spring Boot 2.1.0 已發(fā)布,7 個重大更新!

    摘要:距離重磅正式發(fā)布已經(jīng)過去大半年了,而在月底就發(fā)布了,我們來看下都更新了什么,每一個技術(shù)人都值得關(guān)注。性能提升應(yīng)用程序性能改進性能作為團隊持續(xù)努力的一部分,性能提升在中取得了一些重大進展。 距離《重磅:Spring Boot 2.0 正式發(fā)布!》已經(jīng)過去大半年了,而 Spring Boot 2.1.0 在 10 月底就發(fā)布了,我們來看下 Spring Boot 2.1.0 都更新了什么,...

    Forest10 評論0 收藏0
  • 慕課網(wǎng)_《SpringBoot開發(fā)常用技術(shù)整合》學(xué)習(xí)總結(jié)

    摘要:時間年月日星期四說明本文部分內(nèi)容均來自慕課網(wǎng)。哈希表實現(xiàn)命令,將哈希表中的域的值設(shè)為實現(xiàn)命令,返回哈希表中給定域的值實現(xiàn)命令,刪除哈希表中的一個或多個指定域,不存在的域?qū)⒈缓雎浴崿F(xiàn)命令,返回哈希表中,所有的域和值。 時間:2018年04月19日星期四說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):https://www.imooc.com教學(xué)源碼:https://github.com/zc...

    chengtao1633 評論0 收藏0
  • 《Java編程方法論:響應(yīng)式RxJava與代碼設(shè)計實戰(zhàn)》序

    摘要:原文鏈接編程方法論響應(yīng)式與代碼設(shè)計實戰(zhàn)序,來自于微信公眾號次靈均閣正文內(nèi)容在一月的架構(gòu)和設(shè)計趨勢報告中,響應(yīng)式編程和函數(shù)式仍舊編列在第一季度的早期采納者中。 原文鏈接:《Java編程方法論:響應(yīng)式RxJava與代碼設(shè)計實戰(zhàn)》序,來自于微信公眾號:次靈均閣 正文內(nèi)容 在《2019 一月的InfoQ 架構(gòu)和設(shè)計趨勢報告》1中,響應(yīng)式編程(Reactive Programming)和函數(shù)式...

    PAMPANG 評論0 收藏0
  • Spring Boot 2 快速教程:WebFlux 快速入門(二)

    摘要:響應(yīng)式編程是基于異步和事件驅(qū)動的非阻塞程序,只是垂直通過在內(nèi)啟動少量線程擴展,而不是水平通過集群擴展。三特性常用的生產(chǎn)的特性如下響應(yīng)式編程模型適用性內(nèi)嵌容器組件還有對日志消息測試及擴展等支持。 摘要: 原創(chuàng)出處 https://www.bysocket.com 「公眾號:泥瓦匠BYSocket 」歡迎關(guān)注和轉(zhuǎn)載,保留摘要,謝謝! 02:WebFlux 快速入門實踐 文章工程: JDK...

    gaara 評論0 收藏0

發(fā)表評論

0條評論

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