Запустите процесс, как только загрузится служба Executor Service, а затем подождите в очереди. - PullRequest
0 голосов
/ 09 мая 2019

Я создаю асинхронное решение на основе API с использованием Spring Boot, в котором я использую Executor Service для многопоточности.Код будет работать на нескольких серверах.Так что для логики отработки отказа сервера я планировал добавить идентификатор процесса вместе с IP-адресом сервера в базе данных Postgres.У меня будет настройка задания crontab, которая будет проверять работоспособность всех экземпляров, и в случае сбоя экземпляра я собираю все идентификаторы процесса, связанные с этим IP-адресом сервера (из БД), и повторно запускаю эти задания на другом сервере.,

Предположим, у меня фиксированный пул потоков из 15 потоков, и я получаю 30 потоков.15 будет запущен, а остальные 15 будут поставлены в очередь в Службе Исполнителя.И если сервер сейчас выходит из строя, по крайней мере, у меня были бы подробности о тех, которые работают, но я бы потерял идентификаторы процессов тех, которые поставлены в очередь.Итак, моя задача - сохранить идентификаторы процессов вместе с ips сервера, как только мы добавим их в службу executor, не дожидаясь запуска процесса.Есть ли какой-нибудь механизм для этого?

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

Это конфигурация, которую я настроил при загрузке Spring для службы executor.

@Configuration
@EnableAsync
public class AsyncConfig {


    @Bean(name = "fixedThreadPool")
    public ExecutorService fixedThreadPool() {
        return Executors.newFixedThreadPool(15);
    }

}

Это асинхронный метод, который вызывается из контроллера.

public void asyncMethodToCreateFile(String requestId) {
        String currentIpAddress= 'some logic to get the ip';
        writeStatusInDb(requestId,currentIpAddress)
        System.out.println("In asyncMethodToCreateFile() method...");
        service.writeToFile(requestId);

}

Здесь я хочу запустить метод writeStatusInDb (), как только он будет добавлен в службу executor без необходимости запуска обработки.Но он запускается только после запуска метода.

Существует ли какой-либо метод, который выполняется, как только задание отправляется в службу исполнителя?

...