Maison  >  Article  >  Java  >  Burlando ou @Async du printemps

Burlando ou @Async du printemps

王林
王林original
2024-09-12 10:21:001043parcourir

Burlando o @Async do Spring

Il est courant lors de la création d'applications à l'aide de Spring, d'utiliser l'annotation @EnableAsync pour activer les exécutions asynchrones et avec l'aide de @Async les méthodes les rendent facilement asynchrones.

@Async a essentiellement deux règles d'utilisation :

  • la méthode annotée doit être publique
  • l'invocateur de méthode ne peut pas appartenir à la même classe

Dans l'exemple ci-dessous, il n'y aura aucun problème de compilation, mais la méthode (bien qu'annotée avec @Async) ne s'exécutera pas comme souhaité.

@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!");
    }
}

Et il est très courant que nous souhaitions que, parce que c'est la responsabilité de la classe, le bloc de code qui doit être exécuté de manière asynchrone y reste. Comment résoudre ?

Simple !

Il nous suffit de créer une autre classe qui aide, par exemple :

@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();
    }
}

Nous faisons une injection de dépendances de ce bean là où une exécution asynchrone est souhaitable et en plus de cela, nous pouvons rendre la méthode privée.

@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!");
    }
}

Ce petit exemple démontre l'application de plusieurs concepts et ressources : Inversion de contrôle, Injection de dépendances, SOLID, Design Pattern, Interfaces fonctionnelles.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn