Потеря соединения JDBC с CompletableFuture и SemaphoreJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Потеря соединения JDBC с CompletableFuture и Semaphore

Сообщение Anonymous »

Я пытаюсь обрабатывать два объекта одновременно, поэтому хотел использовать семафор.
Сначала я покажу свой предыдущий рабочий код. Это не гарантирует одновременное выполнение двух потоков, даже если в пуле потоков всего два потока.

Код: Выделить всё

CompletableFuture taskFuture = idList.stream()
.map(id -> (Runnable) () -> processEntity(startTime, id))
.map(task -> CompletableFuture.runAsync(task, executorService))
.collect(Collectors.collectingAndThen(Collectors.toList(),
tasks -> CompletableFuture.allOf(tasks.toArray(new CompletableFuture[0]))));

taskFuture.get();
Пересмотренная логика работы с семафором выглядит следующим образом:

Код: Выделить всё

var semaphore = new StreamSemaphore(MAX_CONCURRENT_EXECUTIONS);
var futureTasks = itemList.stream()
.map(semaphore::acquire)
.map(itemId -> (Supplier) () -> processItem(startTime, itemId))
.map(task -> CompletableFuture.supplyAsync(task, taskExecutor)
.thenAccept(semaphore::release)
.exceptionally(e -> {
log.error("Exception occurred while processing item", e);
System.exit(1);
return null;
}))
.toList();
futureTasks.forEach(TaskProcessor::safeGet);
где находится StreamSemaphore

Код: Выделить всё

public class StreamSemaphore {
private final Semaphore sema;

public StreamSemaphore(int slots) {
sema = new Semaphore(slots);
}

@SneakyThrows
public  T acquire(T obj) {
sema.acquire();
return obj;
}

@SneakyThrows
public  T release(T obj) {
sema.release();
return obj;
}
}
После обработки первых двух объектов выдается ошибка
Изображение


Подробнее здесь: https://stackoverflow.com/questions/793 ... -semaphore
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»