Есть ли причина не использовать ExecutorService внутри компонентов приложения SpringBoot? - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь сделать некоторые вычисления, используя несколько потоков. Я перебрал много статей, касающихся потоков и SpringBoot, но я нашел только два решения: @ EnableAsyn c и использование TaskExecutor. Никто из них не упомянул ExecutorService. Я создал следующий пример, который работает:

@RestController
@RequestMapping("/")
public class Controller {

  private final ComputingService service;

  Controller(ComputingService service) {
     this.service = service;
  }

  @GetMapping
  public ResponseEntity<BigDecimal> computeNumber() {
     return ResponseEntity.ok(service.compute());
  }

}

@Service
public class ComputingService {

  private final ExecutorService executor;
  private final NumberRepository repository;

  public ComputingService(NumberRepository repository) {
     this.repository = repository;
     this.executor = Executors.newFixedThreadPool(6);
  }

  public BigDecimal compute() {
     Future<BigDecimal> numberA = executor.submit(() -> repository.findA());
     Future<BigDecimal> numberB = executor.submit(() -> repository.findB());
     try {
          BigDecimal a = numberA.get();
          BigDecimal b = numberB.get();
          return a.add(b);
     }catch (InterruptedException e) {
          Thread.currentThread().interrupt();
          throw new RuntimeException(e);
     }catch (ExecutionException e) {
          throw new RuntimeException(e));
     }
  }
}

Есть ли подводные камни в таком решении? Должен ли исполнитель быть выключен когда-нибудь? Есть ли разница с таким использованием по сравнению с использованием Spring Task TaskExecutor и ExecutorServiceAdapter по сравнению с методами @ EnableAsyn c и @ Syn c?

...