CompletableFuture позволяют использовать несколько вызовов службы выполняются параллельно

Если у меня есть статистика интерфейсы, связанные с заказами, выборка данные должны быть возвращен 3: количество заказов сегодня, сегодня оборот, общий оборот.

Наш общий подход назвать три последовательных функцию, результат, возвращаемый обратным вызовом вызывающего абонента, призывая эти три последовательного выполнения, если каждый вызов занимает 1 секунду, общее время 3 вызова 3 секунды.

Такой подход очень неэффективен, потому что это не имеет значения, порядок между 3 звонков, поэтому использование эффективности параллельного выполнения будет лучше. Например, с помощью пула потоков ExecutorService асинхронных вызовов.

На самом деле Java8 обеспечивает очень быстрый класс аппаратных средств CompletableFuture, можно также реализовать технологию асинхронной:

 

1  импорт lombok.extern.slf4j.Slf4j;
2  импортных org.springframework.stereotype.Service;
3  
4  импорта java.util.concurrent.CompletableFuture;
5  импорта java.util.concurrent.TimeUnit;
6  
7  @ SLF4J
 8  @Service
 9  общественный  класс OrderService {
 10  
11      / ** 
12       *今日订单数
 13       *
 14       * @return 
15       * / 
16      общественных CompletableFuture <String> todayOrderCount () {
 17         вернуться CompletableFuture.supplyAsync (() -> это .getTodayOrderCount ());
18      }
 19  
20      общественных CompletableFuture <String> todayTurnover () {
 21          возврата CompletableFuture.supplyAsync (() -> это .getTodayTurnover ());
22      }
 23  
24      общественного CompletableFuture <String> totalTurnover () {
 25          возврата CompletableFuture.supplyAsync (() -> это .getTotalTurnover ());
26      }
 27  
28      частных Струнный getTodayOrderCount () {
 29         System.out.println ( "Заказы >>>>>>> запросов сегодня:" + . Thread.currentThread () GetName ());
 30          Попробовать {
 31              TimeUnit.SECONDS.sleep (1. ;)
 32          } улов (InterruptedException Е) {
 33              e.printStackTrace ();
 34          }
 35          возврата "50" ;
 36      }
 37 [  
38      / ** 
39       * день оборот
 40       *
 41       * @return 
42       * / 
43      Частный Строка getTodayTurnover () {
 44         System.out.println ( "операции запроса >>>>>>> сегодня:" + Thread.currentThread () GetName ().);
 45          Попробовать {
 46 является              TimeUnit.SECONDS.sleep (1. ;)
 47          } улов (InterruptedException Е) {
 48              e.printStackTrace ();
 49          }
 50          возврата "200" ;
 51      }
 52  
53      / ** 
54       * общий оборот
 55       *
 56       * @return 
57       * / 
58      Частный Строка getTotalTurnover () {
 59         System.out.println ( ">>>>>>> общий запрос оборота:" + . Thread.currentThread () GetName ());
 60          Попробовать {
 61              TimeUnit.SECONDS.sleep (1. ;)
 62          } улов (InterruptedException Е) {
 63              e.printStackTrace ();
 64          }
 65          возврата "800" ;
 66      }
 67 }

 

1  импорт com.alibaba.fastjson.JSONObject;
2  импорт com.example.sb.service.test.impl.OrderService;
3  импорта lombok.extern.slf4j.Slf4j;
4  импорта org.springframework.beans.factory.annotation.Autowired;
5  импорта org.springframework.web.bind.annotation.GetMapping;
6  импорта org.springframework.web.bind.annotation.RequestMapping;
7  импорт org.springframework.web.bind.annotation.RestController;
8  
9  импорта java.util.concurrent.CompletableFuture;
10  
11  @ SLF4J
 12  @RestController
13 @RequestMapping ( "/ заказ" )
 14  общественного  класса OrderController {
 15  
16      @Autowired
 17      частная OrderService OrderService;
18  
19      @GetMapping ( "/ доклад" )
 20      публичного отчета JSONObject () {
 21          длинный старт = System.currentTimeMillis ();
22          JSONObject = JSON orderReport ();
23          System.out.println ( "耗时:" + (System.currentTimeMillis () - начать));
24          Возвращение JSON;
25      }
 26  
27     частный JSONObject orderReport () {
 28          CompletableFuture <String> todayOrderCountFuture = orderService.todayOrderCount ();
29          CompletableFuture <String> todayTurnoverFuture = orderService.todayTurnover ();
30          CompletableFuture <String> totalTurnoverFuture = orderService.totalTurnover ();
31  
32          JSONObject = JSON новый JSONObject ();
33  
34          todayOrderCountFuture.whenComplete ((V, T) -> {
 35              json.put ( "todayOrderCountFuture" , v);
 36          });
37         todayTurnoverFuture.whenComplete ((V, T) -> {
 38              json.put ( "todayTurnoverFuture" , v);
 39          });
40          totalTurnoverFuture.whenComplete ((V, T) -> {
 41              json.put ( "totalTurnoverFuture" , v);
 42          });
43  
44          CompletableFuture.allOf (todayOrderCountFuture, todayTurnoverFuture, totalTurnoverFuture)
 45                  .thenRun (() -> System.out.println ( "完成!!!!" ))
 46                  .join ();
47          Возвращение JSON;
48      }
 49 }

 

Доступ Браузер: HTTP: // локальный: 8080 / на заказ / Отчет  результатов выполнения снимков следующим образом :

 

 

 Поскольку вызовы моделируются OrderService каждый занимает 1 секунду, 3 вызовы параллельно, отнимает много времени природа в конечном счете, один второй.

 

рекомендация

отwww.cnblogs.com/jun1019/p/11521145.html