@ Async-- facilmente SpringBoot de tarefas assíncronas abertas

tarefas assíncronas

Em muitas empresas, é preciso levar em conta a execução assíncrona de determinadas tarefas, particularmente durante as chamadas longas http interface,
por exemplo:

  • SMS: Depois que chamamos de interface SMS de terceiros para receber uma resposta geralmente resultará em tempo real, mas o resultado não representa a mensagem foi enviada com sucesso, mas disse que a interface de terceiros para verificar os dados básicos não foram informados do problema receber o seu pedido SMS. Quanto a verdadeira mensagem processo de envio é o processamento assíncrono.
  • interface de pagamento: operações de transferência de interface de classe de pagamento em geral são executadas de forma assíncrona, e depois ir para informar o chamador
  • Baixar grande quantidade de tabelas de dados: general exportação de grandes quantidades de dados porque muitos tabelas de dados, sql chumbo complexo de demorado, como usuários de esperar a página é provável que ocorra horas extras e outras razões. Tantos são exportados sob a forma de criação de emprego, assíncrona, em seguida, gerar relatórios para Centro de Download tem gerado um relatório bom.

Claro, há muitas cenas não vou enumerá-los.

Criar um novo tópico

Pode haver muitos brothers'm ainda conseguir Runnable para atingir um novo segmento para fazer a tarefa por Tópico herança ou assíncrona, alguns irmãos estavam usando pool de threads Executors.newFixedThreadPool ();, mas eu não quero preguiçoso para escrever tantas coisas, eu não sei então eu gostaria de criar a roda usada @Async.

@Async Perfil

  • @Async no método deve ser registrado antes do uso por @EnableAsync chamadas assíncronas abertos. (Claro, também pode configuração aberta xml não será discutido aqui)
  • Na Primavera, a marcação método baseado @Async, chamado métodos assíncronos; esses métodos quando executado, será executado em um segmento separado, o chamador sem esperar pela sua conclusão, podemos continuar com outras operações.
  • No método assíncrono acima são indicados por meio de anotação @Async que o processo é executado de forma assíncrona. Lembre-se, no entanto, este método deve ser público, e, em sua própria classe, chame o método assíncrono é inválido.

Simples de usar @Async

No valor de retorno de tarefas assíncronas

Novo serviço para executar tarefas assíncronas

package com.zhibo.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.stereotype.Service;

@EnableAsync
@Service
@Slf4j
public class AsyncDemoService {
    @Async
    public void AsyncTest1(int num) {
        log.info("----------AsyncTest1 num:{} ",num);
    }

    @Async
    public void AsyncTest2(int num){
        log.info("----------AsyncTest2 num:{} ",num);
    }

	// 有返回值的复杂异步任务
    @Async
    public Future<String> AsyncTest(int num)throws Exception{
        log.info("----------AsyncTest1 num:{} ",num);
        Thread.sleep(2000);
        return new AsyncResult<String>("Rsp AsyncTest num:"+num);
    }

	// 错误案例,同一个类中调用是同步的
    public void AsyncTestX(int num) throws Exception{
        AsyncTest1(num);
        AsyncTest2(num);
    }
}

Caso de teste

	@Autowired
    private AsyncDemoService asyncDemoService;

    @Test
    public void asyncTest() throws Exception{
        for (int i = 0 ; i<5;i++){
            asyncDemoService.AsyncTest1(i);
            asyncDemoService.AsyncTest2(i);
        }
        log.info("asyncTest success");
    }

saída Log

[INFO ] [zhibo-test] 2019-04-18 16:33:22.967 [main] [] [] [] com.zhibo.test.service.AsyncDemoServiceTest - asyncTest success
[INFO ] [zhibo-test] 2019-04-18 16:33:22.975 [SimpleAsyncTaskExecutor-1] [] [] [] com.zhibo.service.AsyncDemoService - ----------AsyncTest1 num:0 
[INFO ] [zhibo-test] 2019-04-18 16:33:22.975 [SimpleAsyncTaskExecutor-6] [] [] [] com.zhibo.service.AsyncDemoService - ----------AsyncTest2 num:2 
[INFO ] [zhibo-test] 2019-04-18 16:33:22.975 [SimpleAsyncTaskExecutor-9] [] [] [] com.zhibo.service.AsyncDemoService - ----------AsyncTest1 num:4 
[INFO ] [zhibo-test] 2019-04-18 16:33:22.975 [SimpleAsyncTaskExecutor-8] [] [] [] com.zhibo.service.AsyncDemoService - ----------AsyncTest2 num:3 
[INFO ] [zhibo-test] 2019-04-18 16:33:22.975 [SimpleAsyncTaskExecutor-3] [] [] [] com.zhibo.service.AsyncDemoService - ----------AsyncTest1 num:1 
[INFO ] [zhibo-test] 2019-04-18 16:33:22.975 [SimpleAsyncTaskExecutor-10] [] [] [] com.zhibo.service.AsyncDemoService - ----------AsyncTest2 num:4 
[INFO ] [zhibo-test] 2019-04-18 16:33:22.975 [SimpleAsyncTaskExecutor-5] [] [] [] com.zhibo.service.AsyncDemoService - ----------AsyncTest1 num:2 
[INFO ] [zhibo-test] 2019-04-18 16:33:22.975 [SimpleAsyncTaskExecutor-2] [] [] [] com.zhibo.service.AsyncDemoService - ----------AsyncTest2 num:0 
[INFO ] [zhibo-test] 2019-04-18 16:33:22.975 [SimpleAsyncTaskExecutor-7] [] [] [] com.zhibo.service.AsyncDemoService - ----------AsyncTest1 num:3 
[INFO ] [zhibo-test] 2019-04-18 16:33:22.975 [SimpleAsyncTaskExecutor-4] [] [] [] com.zhibo.service.AsyncDemoService - ----------AsyncTest2 num:1 

@Async é tão simples como teimosa, eu admito que eu sou preguiçoso, mas preguiçoso é uma das virtudes do macaco programa!

Ele retorna um valor de tarefas assíncronas multi-threaded

Caso de teste

	@Autowired
    private AsyncDemoService asyncDemoService;

    @Test
    public void asyncTest() throws Exception{
        //用于收集每个线程的Future
        List<Future<String>> resultList = new ArrayList<>();
        for (int i = 0 ; i<5;i++){
            Future<String> future = asyncDemoService.AsyncTest(i);
            resultList.add(future);
        }
        //开始处理返回值
        for (Future<String> future:resultList){
            //get方法是阻塞式的
            log.info(future.get());
        }
        log.info("asyncTest success");
    }

saída Log

[INFO ] [zhibo-test] 2019-04-18 20:06:56.547 [SimpleAsyncTaskExecutor-5] [] [] [] com.zhibo.service.AsyncDemoService - ----------AsyncTest1 num:4 
[INFO ] [zhibo-test] 2019-04-18 20:06:56.547 [SimpleAsyncTaskExecutor-2] [] [] [] com.zhibo.service.AsyncDemoService - ----------AsyncTest1 num:1 
[INFO ] [zhibo-test] 2019-04-18 20:06:56.547 [SimpleAsyncTaskExecutor-4] [] [] [] com.zhibo.service.AsyncDemoService - ----------AsyncTest1 num:3 
[INFO ] [zhibo-test] 2019-04-18 20:06:56.547 [SimpleAsyncTaskExecutor-3] [] [] [] com.zhibo.service.AsyncDemoService - ----------AsyncTest1 num:2 
[INFO ] [zhibo-test] 2019-04-18 20:06:56.547 [SimpleAsyncTaskExecutor-1] [] [] [] com.zhibo.service.AsyncDemoService - ----------AsyncTest1 num:0 
[INFO ] [zhibo-test] 2019-04-18 20:06:59.540 [main] [] [] [] com.zhibo.test.service.AsyncDemoServiceTest - Rsp AsyncTest num:0
[INFO ] [zhibo-test] 2019-04-18 20:06:59.540 [main] [] [] [] com.zhibo.test.service.AsyncDemoServiceTest - Rsp AsyncTest num:1
[INFO ] [zhibo-test] 2019-04-18 20:06:59.541 [main] [] [] [] com.zhibo.test.service.AsyncDemoServiceTest - Rsp AsyncTest num:2
[INFO ] [zhibo-test] 2019-04-18 20:06:59.541 [main] [] [] [] com.zhibo.test.service.AsyncDemoServiceTest - Rsp AsyncTest num:3
[INFO ] [zhibo-test] 2019-04-18 20:06:59.541 [main] [] [] [] com.zhibo.test.service.AsyncDemoServiceTest - Rsp AsyncTest num:4
[INFO ] [zhibo-test] 2019-04-18 20:06:59.541 [main] [] [] [] com.zhibo.test.service.AsyncDemoServiceTest - asyncTest success

done ~ ainda simples. Irmãos arregaçar as mangas reabastecimento seco.
Digressão: a sensação de que agora não é uma indústria mix ruim mais do que alguns anos atrás? Um amigo encontrar um emprego em anormalidades Wuhan não vão bem, em comparação com o norte de Cantão, Shenzhen a partir de Hangzhou para deixar cair um terço? E está entrevistando aviões e entrada de apertar os parafusos ...
Ouvi dizer que há um milhão de entrevistador concorrente pergunta como lidar com o negócio, provavelmente eu era muito pratos Acho que este perguntas da entrevista tem BUG!
1, não descreve projeto how específico cenário de negócios?
2. Que complicada por que? Não estou me referindo ao número de solicitações por segundo? Um segundo de um milhão, a fim de garantir que a velocidade de resposta do servidor que você quer, então quantos? pergunta tal não é direito para trabalhar três ou quatro anos,
eu não tenho nenhuma maneira por causa da exposição do trabalho de alta concorrência de saber se este não é particularmente big science sob Deus quiser grato! obrigado

Publicado 18 artigos originais · Louvor obteve 45 · vista 110 000 +

Acho que você gosta

Origin blog.csdn.net/zhibo_lv/article/details/89387317
Recomendado
Clasificación