У меня есть пружинный компонент, который выглядит следующим образом:
@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
.Теперь мои вопросы таковы:
- Это хорошая идея использовать
ExecutorService
в пружинных компонентах?Поскольку один и тот же компонент будет использоваться в параллельных запросах Tomcat и каждый из этих запросов отправляет 5 задач в пул потоков, не будет ли у него 5 одновременных запросов? - Есть ли лучший способ сделать мою работу?Я могу увеличить размер очереди блокировки, но как долго это продержится.(Пакетирование не вариант).