Должен ли я использовать ExecutorService в компоненте Spring? - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть пружинный компонент, который выглядит следующим образом:

@Component
public class ProfileService {

  private final ExecutorService executorService = ExecutorFactory.newThreadPoolExecutor(getClass().getSimpleName(),
  5, 100, 10, TimeUnit.MINUTES,
  new ArrayBlockingQueue<>(1), new ThreadPoolExecutor.AbortPolicy());

  public Map<Integer, String> getProfiles(String client, Set<String> pIds) {
    Map<String, Future<Optional<Profile>>> profileFutures = new HashMap<>(pIds.size());
    for (String pId : pIds) {
      locationsFutures.put(clusterMcId, executorService.submit(() -> getProfile(client, pId)));
    }
    Map<String, String> profileNames = new HashMap<>();
    for (String pId : profileFutures.keySet()) {
        profileFutures.get(pId).get(200, TimeUnit.MILLISECONDS).ifPresent(
          profile -> profileNames.put(pId, profile.getName());
    }
    return profileNames;
  }

Я просто делаю параллельные вызовы, чтобы получить профили, используя их идентификаторы, и жду завершения фьючерса.Я продолжаю получать RejectedExecutionException при отправке задачи на executorService.Теперь мои вопросы таковы:

  1. Это хорошая идея использовать ExecutorService в пружинных компонентах?Поскольку один и тот же компонент будет использоваться в параллельных запросах Tomcat и каждый из этих запросов отправляет 5 задач в пул потоков, не будет ли у него 5 одновременных запросов?
  2. Есть ли лучший способ сделать мою работу?Я могу увеличить размер очереди блокировки, но как долго это продержится.(Пакетирование не вариант).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...