【问题标题】:Reload scheduledExecutorService without reloading of server重新加载 scheduleExecutorService 而不重新加载服务器
【发布时间】:2018-10-10 11:19:43
【问题描述】:

我有这门课:

@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);
        }
    }
}

服务器启动后,我使用属性(SCHEDULER_COUNT)中的corePoolSize 值创建ScheduledExecutorService,并启动SCHEDULER_COUNT 次。现在我有 5 个调度程序,每个调度程序触发 1 个 NANOSECONDS。

现在我需要 mechanizm 来更改属性中的 SCHEDULER_COUNT 并使用新的 cont(例如 10)重新运行 ScheduledExecutorService 而不是重新启动服务器。有什么想法吗?

其中一个想法是编写一个休息服务,该服务将从该值重新加载并重新启动调度程序。但这是理论上的

【问题讨论】:

    标签: java spring spring-boot scheduled-tasks scheduledexecutorservice


    【解决方案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);
            }
        }
    }
    

    然后可以使用 REST 服务完成对 setCount 的调用,是的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 2015-01-21
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      • 2018-05-26
      相关资源
      最近更新 更多