anuário
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