欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Springboot利用Aop捕捉注解實現(xiàn)業(yè)務(wù)異步執(zhí)行

 更新時間:2023年04月03日 10:43:51   作者:ForestSpringH  
在開發(fā)過程中,盡量會將比較耗時且并不會影響請求的響應(yīng)結(jié)果的業(yè)務(wù)放在異步線程池中進行處理,那么到時什么任務(wù)在執(zhí)行的時候會創(chuàng)建單獨的線程進行處理呢?這篇文章主要介紹了Springboot利用Aop捕捉注解實現(xiàn)業(yè)務(wù)異步執(zhí)行

在開發(fā)過程中,盡量會將比較耗時且并不會影響請求的響應(yīng)結(jié)果的業(yè)務(wù)放在異步線程池中進行處理,那么到時什么任務(wù)在執(zhí)行的時候會創(chuàng)建單獨的線程進行處理呢?我們可以在對應(yīng)的業(yè)務(wù)方法上打上自定義的注解,再利用AOP去捕捉這個注解,就可以利用環(huán)繞通知的特性進行異步的設(shè)置。

一、先說說線程的幾種創(chuàng)建方式(簡要列舉)

1、繼承Thread類,復(fù)寫run方法:

public class ExtendsThread extends Thread{
    @Override
    public void run() {
        try{
            System.out.println(Thread.currentThread().getName()+"執(zhí)行");
        }catch (Exception e){
 
        }
    }
    public static void main(String[] args) {
        new Thread(new ExtendsThread()).start();
    }
}

2、實現(xiàn)Runnable接口,重寫run方法:

public class ImplementsRunnable implements Runnable{
    @Override
    public void run() {
        try{
            System.out.println(Thread.currentThread().getName()+"執(zhí)行");
        }catch (Exception e){
 
        }
    }
    public static void main(String[] args) {
        new Thread(new ImplementsRunnable()).start();
        //這里還可以使用匿名內(nèi)部類的寫法創(chuàng)建一個線程
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"執(zhí)行");
            }
        },"匿名內(nèi)部類實現(xiàn)Runnable接口的線程");
    }
}

3、實現(xiàn)Callable接口,使用FutureTask創(chuàng)建線程(可以獲得返回值):

public class CallableAndFuture implements Callable<String> {
    @Override
    public String call() throws Exception {
        Thread.sleep(3000);
        System.out.println(Thread.currentThread().getName()+"執(zhí)行");
        return "success";
    }
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<String> futureTask = new FutureTask<>(new CallableAndFuture());
//        futureTask.run();   主線程執(zhí)行call方法
        new Thread(futureTask).start();
        String result = futureTask.get();
        System.out.println(result);
    }
}

4、使用線程池創(chuàng)建線程(這里利用提供的線程池框架Executors創(chuàng)建線程池):

public class Executor {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        executorService.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"執(zhí)行");
            }
        });
    }
}

二、再聊一聊spring自帶的@Async注解實現(xiàn)異步任務(wù)的方法

其實很簡單,就是在應(yīng)用程序啟動類上打@EnableAsync注解開啟異步注解的使用,再在業(yè)務(wù)類的某個方法上打@Async即可。

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

業(yè)務(wù)類方法(舉例):

   @Async
    public void insertDb(){
        /*service code......*/
        System.out.println("2----->收到請求,寫入數(shù)據(jù)庫  ");
    }

三、那么就來設(shè)計一下怎么使用自定義的注解實現(xiàn)異步任務(wù)

首先我們寫一個注解:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAsync {
    //規(guī)定value是異步開關(guān)
    boolean value() default false;
}

我們讓注解中的value的值定為布爾類型,從而根據(jù)它的真假來決定異步線程的創(chuàng)建。

我們將它打在業(yè)務(wù)類的方法上:

  @MyAsync(value = true)
    public void deleteDb(){
        /*service code......*/
        System.out.println("delete------>數(shù)據(jù)刪除");
    }

然后我們利用AOP掃描這個注解:

Aspect
@Component
public class AopUtils {
    @Around(value = "@annotation(com.example.aop.Aop異步.MyAsync)")
    public void listenMyAsync(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        MyAsync annotation = method.getAnnotation(MyAsync.class);
        boolean value = annotation.value();
        if (value)
            new Thread(new Runnable() {
                @SneakyThrows
                @Override
                public void run() {
                    joinPoint.proceed();
                }
            }).start();
        else
            joinPoint.proceed();
    }
}

我們可以看到利用Around尋找執(zhí)行的線程中某個含有注解的方法棧,捕捉到之后就可以獲得對應(yīng)的連接點對象了。

利用可通過連接點對象ProcedJoinPoint的getSignture方法獲取簽名,可以將簽名強制轉(zhuǎn)化成方法簽名MethdSignture類型,從而利用該類型的getMethod方法獲取方法本身,接下來就可以獲取方法的注解,利用注解的屬性直接獲取value的真假,從而決定方法通過的方式是同步的還是異步的。(源碼利用到反射機制)。

到此這篇關(guān)于Springboot利用Aop捕捉注解實現(xiàn)業(yè)務(wù)異步執(zhí)行的文章就介紹到這了,更多相關(guān)Springboot業(yè)務(wù)異步執(zhí)行內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java如何使用elasticsearch進行模糊查詢

    Java如何使用elasticsearch進行模糊查詢

    這篇文章主要介紹了Java如何使用elasticsearch進行模糊查詢,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • Java中的代理原理及代理使用示例

    Java中的代理原理及代理使用示例

    這篇文章主要介紹了Java中的代理原理及代理使用示例,本文講解了Java Socket編程中加入代理的2種方法,需要的朋友可以參考下
    2015-03-03
  • MyBatis-Plus自動化填充的踩坑記錄及解決

    MyBatis-Plus自動化填充的踩坑記錄及解決

    這篇文章主要介紹了MyBatis-Plus自動化填充的踩坑記錄及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • SpringBoot系列教程之防重放與操作冪等

    SpringBoot系列教程之防重放與操作冪等

    同一條數(shù)據(jù)被用戶點擊了多次,導(dǎo)致數(shù)據(jù)冗余,需要防止弱網(wǎng)絡(luò)等環(huán)境下的重復(fù)點擊,下面這篇文章主要給大家介紹了關(guān)于SpringBoot系列教程之防重放與操作冪等的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • java struts2學(xué)習(xí)筆記之線程安全

    java struts2學(xué)習(xí)筆記之線程安全

    這篇文章主要為大家詳細介紹了java struts2學(xué)習(xí)筆記之線程安全,感興趣的朋友可以參考一下
    2016-04-04
  • 優(yōu)化spring?boot應(yīng)用后6s內(nèi)啟動內(nèi)存減半

    優(yōu)化spring?boot應(yīng)用后6s內(nèi)啟動內(nèi)存減半

    這篇文章主要為大家介紹了優(yōu)化spring?boot后應(yīng)用6s內(nèi)啟動內(nèi)存減半的優(yōu)化示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-02-02
  • 給Java菜鳥的一些建議_關(guān)于Java知識點歸納(J2EE and Web 部分)

    給Java菜鳥的一些建議_關(guān)于Java知識點歸納(J2EE and Web 部分)

    下面小編就為大家?guī)硪黄oJava菜鳥的一些建議_關(guān)于Java知識點歸納(J2EE and Web 部分)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Java基于IO流讀取文件的方法

    Java基于IO流讀取文件的方法

    這篇文章主要介紹了Java基于IO流讀取文件的方法,涉及Java文件流操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • spring學(xué)習(xí)之@SessionAttributes實例解析

    spring學(xué)習(xí)之@SessionAttributes實例解析

    這篇文章主要介紹了spring學(xué)習(xí)之@SessionAttributes實例解析,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • Java并發(fā)編程如何降低鎖粒度并實現(xiàn)性能優(yōu)化

    Java并發(fā)編程如何降低鎖粒度并實現(xiàn)性能優(yōu)化

    這篇文章主要介紹了Java并發(fā)編程如何降低鎖粒度并實現(xiàn)性能優(yōu)化,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08

最新評論