Como escrever à mão uma anotação assíncrona @Async

1. Anotações personalizadas

Personalize uma anotação @MyAsync, você pode copiar @Async

@Target({
    
    ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAsync {
    
    
    
}

2. Escreva classes de aspecto AOP

@Aspect
@Component
public class MyAsyncAop {
    
    

    @Around(value = "@annotation(org.sang.annotation.MyAsync)")
    public Object around(ProceedingJoinPoint joinPoint) {
    
    
        try {
    
    
            System.out.println("环绕通知开始执行--");
            new Thread(() -> {
    
    
                try {
    
    
                    joinPoint.proceed();
                } catch (Throwable throwable) {
    
    
                    throwable.printStackTrace();
                }
            }).start();

            System.out.println("环绕通知结束执行--");
        } catch (Exception e) {
    
    

        } catch (Throwable throwable) {
    
    
            throwable.printStackTrace();
        }
        return null;
    }
}

3. Escreva aulas de teste

classe do controlador:

   @RequestMapping("/mysync")
    public String mysync(){
    
    
        System.out.println("-------------<1>--------------");
        this.userService.asnycLog();
        System.out.println("-------------<3>--------------");
        return "success";
    }

classe de serviço:

  @MyAsync
    public void asnycLog() {
    
    
        try {
    
    
            System.out.println("目标方法开始执行,正在阻塞3s----");
            Thread.sleep(3000);
            System.out.println("-------------<2>--------------");
        }catch (Exception e){
    
    

        }

    }

Acesso local:
Insira a descrição da imagem aqui

O resultado da impressão é o seguinte:

-------------<1>--------------
环绕通知开始执行--
环绕通知结束执行--
-------------<3>--------------
目标方法开始执行,正在阻塞3s----
-------------<2>--------------

4. Resumo

Como pode ser visto no log de impressão acima, quando o método asnycLog() do serviço é chamado do controlador, porque o método asnycLog() possui a anotação @MyAsync e a anotação @MyAsync possui uma notificação circundante definida no aop , um novo thread filho é iniciado.Execução, portanto, não há necessidade de esperar a execução do thread principal, alcançando assim a execução assíncrona. Portanto, a execução do thread principal é concluída, a execução do subthread é finalmente concluída e a execução do programa através do método anotado com @MyAsync é executada de forma assíncrona.

Acho que você gosta

Origin blog.csdn.net/m0_37899908/article/details/132010550
Recomendado
Clasificación