5
respostas

Servioç Spring com método assíncrono

Pessoal, boa tarde. Tenho uma aplicação que instância uma thread (metodo_B) sempre que um método (metodo_A) é acionado. Isso foi desenvolvido dessa forma para não travar a chamada do metodo_A, pois o que roda na thread (metodo_B) é mais demorado. Acontece que esse medodo_A é chamado diversas vezes, ou seja, diversas threads ficam processando em paralelo o tempo todo. A minha dúvida é se o serviço inteiro for parado (sudo systemctl stop service_name.service) e iniciado novamente (sudo systemctl start service_name.service) ele irá voltar a executar tudo que estava nas threads no momento do stop.

Saberiam me dizer isso? Obrigado!

Estou usando java 11. O serviço é no Spring boot e as threds foram inciadas pelo Thread t = new Thread(new Runnable() {} dentro de um método.

metodo_A{ executa_uma_tarefa(); método_B(); } metodo_B{ Thread t = new Thread(new Runnable() { //código lento } }

5 respostas

Fala Alexandre, tudo bem??

Se você fizer isso vai reiniciar todo o contexto da aplicação, o que inclui todas as threads que estavam em execução.

Sugestão: tente utilizar as capacidades de execução assíncrona que o Spring Boot oferece, por exemplo, utilizando a anotação @Async nos métodos que você precisa executar de forma assíncrona. O Spring Boot vai gerenciar automaticamente a execução desses métodos em threads separadas, o que pode ser mais seguro e eficiente do que criar threads manualmente.

Se tiver muitras threads você poder ter problemas de desempenho e falta de recursos do sistema (memória e cpu). É recomendável avaliar se a criação de threads é realmente necessária em cada caso e se há alternativas mais eficientes para lidar com tarefas demoradas.

Otávio, tudo certo.

Obrigado pelo retorno! Mas se usar o @Assync eu não perderia também os dados das threads oa reiniciar o serviço?

Abraço!

Sim, ao utilizar o @Async o Spring Boot irá gerenciar a execução dos métodos assíncronos em threads separadas, e ao reiniciar o serviço essas threads serão finalizadas. No entanto, o Spring Boot possui um mecanismo de fila de tarefas assíncronas, que permite que as tarefas pendentes sejam executadas assim que o serviço for reiniciado. Dessa forma, os dados das threads não serão perdidos, desde que as tarefas tenham sido colocadas na fila corretamente. É importante lembrar também que o uso excessivo de threads pode impactar a performance e a escalabilidade do sistema, então é importante avaliar bem a necessidade de execução assíncrona de cada tarefa.

Otávio, e que "mecanismo de fila de tarefas assíncronas" é é esse para eu dar uma estudada?

Abraço e obrigado!

O mecanismo de fila de tarefas assíncronas do Spring Boot é implementado através do uso da classe ThreadPoolTaskExecutor. Essa classe é configurada através da anotação @EnableAsync e pode ser personalizada com diversas opções de configuração, como tamanho máximo da fila, tamanho máximo do pool de threads, tempo máximo de espera na fila, entre outras. Você pode encontrar mais informações sobre a configuração do ThreadPoolTaskExecutor na documentação oficial do Spring Boot: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.html

Alguns links: https://www.baeldung.com/spring-async https://spring.io/guides/gs/async-method/