Перезагрузить scheduleExecutorService без перезагрузки сервера

У меня такой класс:

@Slf4j
@Component
public class MyScheduler {

    @Value("${scheduler.count}")
    private int SCHEDULER_COUNT;//for example 5

    private final SendRequestForResponseService sendRequestForResponseService;

    public MyScheduler(SendRequestForResponseService sendRequestForResponseService) {
        this.sendRequestForResponseService = sendRequestForResponseService;
    }

    @PostConstruct
    public void getRequestResponse() {
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(SCHEDULER_COUNT, new ThreadPoolTaskScheduler());
        for (int i = 0; i < SCHEDULER_COUNT; i++) {
            scheduledExecutorService.scheduleWithFixedDelay(sendRequestForResponseService::sendGetResponseRequest, 1, 1, TimeUnit.NANOSECONDS);
        }
    }
}

После запуска сервера я создаю ScheduledExecutorService со значением corePoolSize из свойств (SCHEDULER_COUNT) и запускаю SCHEDULER_COUNT раз. Теперь у меня есть 5 планировщиков, которые запускают каждую 1 НС.

Теперь мне нужен механизм для изменения SCHEDULER_COUNT в свойстве и перезапуска ScheduledExecutorService с новым cont (например 10), а не перезапуска сервера. возможны ли какие-нибудь идеи?

Одна из идей - написать сервис отдыха, который будет перезагружаться из значения и перезапускает планировщик. но это в теории

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
35
1

Ответы 1

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

@Slf4j
@Component
public class MyScheduler {
    private ScheduledExecutorService scheduledExecutorService;

    @Value("${scheduler.count}")
    private int SCHEDULER_COUNT;//for example 5

    private final SendRequestForResponseService sendRequestForResponseService;

    public MyScheduler(SendRequestForResponseService sendRequestForResponseService) {
        this.sendRequestForResponseService = sendRequestForResponseService;
    }

    @PostConstruct
    public void getRequestResponse() {
        setCount(env.getProperty("", Integer.class, 5);
    }

    public void setCount(int newCount) {
        if (scheduledExecutorService != null) {
            scheduledExecutorService.shutdown();
        }
        scheduledExecutorService = Executors.newScheduledThreadPool(SCHEDULER_COUNT, new ThreadPoolTaskScheduler());
        int schedulerCount = newCount;
        for (int i = 0; i < schedulerCount; i++) {
            scheduledExecutorService.scheduleWithFixedDelay
                (sendRequestForResponseService::sendGetResponseRequest, 1, 1,
                                                TimeUnit.NANOSECONDS);
        }
    }
}

Тогда вызов setCount можно было бы сделать с помощью службы REST, да.

Другие вопросы по теме