Como usar @Async com Spring Boot
Neste post vou mostrar como configurar seu projeto para utilizar métodos assíncronos além de explicar o funcionamento destes métodos.
Última atualização em: | 18495 Visualizações
Vamos começar falando sobre Thread
.
Podemos dizer que Thread
é um pequeno programa que trabalha como um subsistema em um processamento paralelo, sendo uma forma de dividir um processo em duas ou mais tarefas.
Entendendo esse simples conceito, podemos passar a falar do @Async
com Spring Boot.
Para que serve o @Async
Para entender, vamos usar um exemplo de um envio de e-mail.
Quando você faz uma requisição para o servidor, este deve fazer o processamento programado e posteriormente retornar o resultado.
No caso de um envio de e-mail, pode levar alguns segundos até que o e-mail seja devidamente enviado. Então, se após prepararmos os dados, criarmos uma nova thread para fazer este envio, teremos uma resposta muito mais rápida para o usuário, enquanto o programa permanece realizando o envio.
Para este caso usamos o @Async
.
Usando @Async com Spring Boot
Vamos ao exemplo.
Considere uma aplicação em Spring Boot com o seguinte xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>br.com.garbosoftware</groupId>
<artifactId>news</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>news</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Na classe principal, é necessário anotar com @EnableAsync
para habilitar métodos assincronos (Anotados com @Async
).
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
@SpringBootApplication
@EnableAsync
public class NewsApplication {
public static void main(String[] args) {
SpringApplication.run(NewsApplication.class, args);
}
}
Agora nossa aplicação já está pronta para utilizar métodos assincronos. Seguindo no exemplo de envio de email teremos as seguintes classes:
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@Slf4j
public class EnviarController {
@Autowired
private MyService myService;
@PostMapping("send")
public String send() {
LOGGER.info("Start send.");
myService.send();
LOGGER.info("Send processing.");
return "ok";
}
}
Note que ao chamar o método
send()
do serviço, não esperamos seu retorno.
Agora veja o service:
MyService.java
public interface MyService {
void send();
}
MyServiceImpl.java
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class MyServiceImpl implements MyService {
@Async
@Override
public void send() {
// [...]
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LOGGER.info("Finished process.");
}
}
Agora ao chamar o http://localhost:8080/send
, teremos uma resposta rápida e um processo que será continuado de forma assincrona pelo tempo determinado no Thread.sleep()
, no caso 5000 ms para então mostrar a mensagem Finished process.
.
Não esqueca de deixar suas dúvidas nos comentários e compartilhar este post.