У меня такой класс:
@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), а не перезапуска сервера. возможны ли какие-нибудь идеи?
Одна из идей - написать сервис отдыха, который будет перезагружаться из значения и перезапускает планировщик. но это в теории




Я думаю, вам нужно сохранить свой планировщик, чтобы вы могли отменить предыдущие задачи:
@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, да.