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 :
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!