Перезагрузка запланированного выполнения сервиса без перезагрузки сервера - PullRequest
0 голосов
/ 10 октября 2018

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

@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 с новым контентом (например, 10) и без перезапуска сервера.Возможно ли какие-либо идеи?

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

1 Ответ

0 голосов
/ 10 октября 2018

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

@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, да.

...