У меня есть AWS Lambda, который принимает список записей в качестве входных данных (скажем, 1000 записей являются входными). Цель этой лямбды - записать эти записи в базу данных Dynamo. Исходя из этих входящих записей, я подготавливаю запросы BatchWriteItemRequest, каждый из которых содержит 25 PutRequest, в общей сложности 40 пакетов, каждый из которых содержит 25 PutRequest s.
Я использую CompletionService с Executor Service с фиксированным пулом потоков, равным 10. Служба завершения используется для одновременной отправки 10 пакетных запросов, и, следовательно, 250 запросов PUT отправляются в динамо параллельно через 10 вызовов BatchWriteItemRequest.
final CompletionService<ResultWrapper> completionService = new ExecutorCompletionService<>(
getExecutorService(threadPoolSize));
Мой вопрос: Служба завершения следит за тем, чтобы все задачи выполнялись завершены, и его ответы возвращаются. Нужно ли явно отключать службу executor после того, как все (40) вызовы сделаны и вернули ответ? Каковы будут последствия, если я не отключу его явно?
Во-вторых, я создаю службу executor в качестве статического c экземпляра. Следовательно, если контейнер Lambda используется повторно, я не заканчиваю тем, что создаю службу executor для каждого вызова Lambda. Таким образом, если я закрою службу executor, и тот же самый лямбда-контейнер будет повторно использован, входящие запросы не будут выполнены. Разве закрытие службы исполнителя не является хорошим выбором?
for (int index = 0; index < 10; index++, submitted++) {
completionService.submit(new Worker());
}
// total = 40
for (int index = 0; index < total; index++) {
final Future<ResultWrapper> future = completionService.take();
final ResultWrapper result = future.get();
completed++;
if (result == null) {
continue;
}
// Once a task completes, submit one from those that remain
if (submitted < total) {
completionService.submit(new Worker());
submitted++;
}
}
// Should I call executorService.shutdown() ?