>  기사  >  Java  >  Springboot가 Aop 캡처 주석을 사용하여 비즈니스 비동기 실행을 구현하는 방법

Springboot가 Aop 캡처 주석을 사용하여 비즈니스 비동기 실행을 구현하는 방법

WBOY
WBOY앞으로
2023-05-23 19:01:041191검색

1. 먼저 스레드를 생성하는 여러 가지 방법에 대해 이야기하겠습니다(간략한 목록)

1. Thread 클래스 상속 및 실행 메서드 재정의:

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

2 Runnable 인터페이스 구현 및 실행 메서드 재정의:

public class ImplementsRunnable implements Runnable{
    @Override
    public void run() {
        try{
            System.out.println(Thread.currentThread().getName()+"执行");
        }catch (Exception e){
 
        }
    }
    public static void main(String[] args) {
        new Thread(new ImplementsRunnable()).start();
        //这里还可以使用匿名内部类的写法创建一个线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"执行");
            }
        },"匿名内部类实现Runnable接口的线程");
    }
}

3 . Callable 인터페이스를 구현하고 FutureTask를 사용하여 스레드를 생성합니다(반환 값을 얻을 수 있음):

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

4. 스레드 풀을 사용하여 스레드를 생성합니다(여기서는 제공된 스레드 풀 프레임워크 실행기를 사용하여 스레드 풀을 생성합니다). :

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()+"执行");
            }
        });
    }
}

2. Spring 고유의 @Async 주석을 사용하여 비동기 작업을 구현하는 방법은 실제로 매우 간단합니다. @EnableAsync 주석을 응용 프로그램 시작 클래스에 넣어 비동기 주석을 사용하도록 설정한 다음 @Async를 추가하면 됩니다. 비즈니스 클래스의 방법에 대해.

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

비즈니스 클래스 방법(예):

   @Async
    public void insertDb(){
        /*service code......*/
        System.out.println("2----->收到请求,写入数据库  ");
    }

3. 그런 다음 사용자 정의 주석을 사용하여 비동기 작업을 구현하는 방법을 설계해 보겠습니다.

먼저 주석을 작성합니다.

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAsync {
    //规定value是异步开关
    boolean value() default false;
}

주석의 값을 부울 유형으로 설정합니다. 참 또는 거짓 값을 기반으로 비동기 스레드 생성을 결정합니다.

비즈니스 클래스의 메소드에 배치합니다:

  @MyAsync(value = true)
    public void deleteDb(){
        /*service code......*/
        System.out.println("delete------>数据删除");
    }

그런 다음 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를 사용하는 것을 볼 수 있습니다. 즉, 해당 연결점 개체를 얻을 수 있습니다.

연결점 개체 ProcedJoinPoint의 getSignture 메서드를 사용하여 서명을 메서드 서명 MethdSignture 유형으로 변환한 다음 이 유형의 getMethod 메서드를 사용하여 메서드 자체를 얻을 수 있습니다. 메서드의 주석을 얻고 주석의 속성을 사용하여 메서드가 동기적으로 전달되는지 아니면 비동기적으로 전달되는지를 결정하기 위해 값의 true 또는 false 값을 직접 얻을 수 있습니다. (소스 코드는 반사 메커니즘을 활용합니다).

위 내용은 Springboot가 Aop 캡처 주석을 사용하여 비즈니스 비동기 실행을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제