>  기사  >  Java  >  Burlando o @Async do Spring

Burlando o @Async do Spring

王林
王林원래의
2024-09-12 10:21:001043검색

Burlando o @Async do Spring

Spring을 사용하여 애플리케이션을 구축할 때 @EnableAsync 주석을 사용하여 비동기 실행을 활성화하고 @Async를 사용하는 것이 일반적입니다. 메소드를 통해 쉽게 비동기화할 수 있습니다.

@Async에는 기본적으로 두 가지 사용 규칙이 있습니다.

  • 주석이 달린 메소드는 공개되어야 합니다
  • 메서드 호출자는 동일한 클래스에 속할 수 없습니다

아래 예에서는 컴파일 문제가 없지만 메서드(@Async 주석이 지정되었음에도 불구하고)가 원하는 대로 실행되지 않습니다.

@Slf4j
@Service
@RequiredArgsConstructor
public class HelloService {

    public String get() {
        log.info("Chegou!");
        print();

        return "Ola!";
    }

    @Async
    @SneakyThrows
    public void print() {
        Thread.sleep(Duration.ofSeconds(5));

        log.info("Burlado!");
    }
}

그리고 클래스의 책임이기 때문에 비동기적으로 실행되어야 하는 코드 블록이 클래스에 남아 있기를 바라는 것이 매우 일반적입니다. 어떻게 해결하나요?

간단해요!

도움이 되는 또 다른 클래스를 만들면 됩니다. 예를 들면 다음과 같습니다.

@Service
public class AsyncService {

    @Async
    public void run(final Runnable runnable) {
        runnable.run();
    }

    @Async
    public <O> O run(final Supplier<O> supplier) {
        return supplier.get();
    }
}

비동기 실행이 바람직한 이 Bean에 대해 종속성 주입을 수행하고, 게다가 메소드를 비공개로 만들 수 있습니다.

@Slf4j
@Service
@RequiredArgsConstructor
public class HelloService {

    private final AsyncService asyncService;

    public String get() {
        log.info("Chegou!");

        asyncService.run(this::print);

        return "Ola!";
    }

    @SneakyThrows
    private void print() {
        Thread.sleep(Duration.ofSeconds(5));

        log.info("Burlado!");
    }
}

이 작은 예는 제어 역전, 종속성 주입, SOLID, 디자인 패턴, 기능적 인터페이스 등 여러 개념과 리소스의 적용을 보여줍니다.

위 내용은 Burlando o @Async do Spring의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.