Start here. This is the direct spoken answer to practice first.
Overview
@Async moves work to an executor; it does not make that work durable or remove the need to design its failure behavior.
@Async submits a proxied method invocation to a Spring TaskExecutor and returns immediately or through a future-like result. Self-invocation bypasses the proxy, so calling an async method from another method on the same bean can run synchronously. I choose a named, bounded executor and use CompletableFuture or another observable result when the caller needs success or failure.