如何通过属性配置禁用Spring SchedulerFactoryBean中指定Quartz任务
Quartz单配置项多任务独立开关实现方案
注意:你原有实现中多次调用
setTriggers()的逻辑存在问题,该方法是覆盖式设置触发器而非追加,最终只有最后一个开关为true的触发器会生效,以下方案会同步修正该问题。
空格分隔1/0配置实现方案
1. 调整配置项
application.properties中新增单个配置,1代表开启、0代表关闭,位顺序和任务一一对应即可:
# 位顺序对应:fp任务、ps任务、ofb任务、mgl任务 enable.job.task=0 0 1 1
2. 注入并转换配置为布尔开关列表
借助Spring SpEL表达式直接把空格分隔的字符串转换为对应顺序的布尔列表:
// 自动处理配置字符串为布尔开关列表,顺序和配置位一一对应 @Value("#{'${enable.job.task}'.trim().split('\\s+').stream().map(flag -> '1'.equals(flag.trim())).toList()}") private List<Boolean> taskEnableFlags;
3. 筛选触发器并统一设置
触发器列表的顺序要和配置位的顺序严格对应,筛选后一次性设置到SchedulerFactoryBean:
@Bean public SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); // 触发器顺序必须和配置位顺序保持一致:fp -> ps -> ofb -> mgl List<Trigger> allTriggers = List.of( fpCronTriggerFactoryBean().getObject(), psCronTriggerFactoryBean().getObject(), ofbCronTriggerFactoryBean().getObject(), mglCronTriggerFactoryBean().getObject() ); // 过滤出需要开启的触发器 List<Trigger> enabledTriggers = IntStream.range(0, allTriggers.size()) .filter(i -> taskEnableFlags.get(i)) .mapToObj(allTriggers::get) .toList(); // 统一设置触发器 schedulerFactoryBean.setTriggers(enabledTriggers.toArray(new Trigger[0])); return schedulerFactoryBean; }
更易维护的可选方案
如果担心顺序对应出错,可以换成指定开启任务名的配置方式,不需要关心顺序,新增删除任务时更灵活:
配置示例
# 直接填写需要开启的任务名,多个用逗号分隔 enable.job.task=ofb,mgl
代码实现
@Value("#{'${enable.job.task}'.trim().split(',').stream().map(String::trim).filter(str -> !str.isEmpty()).toList()}") private List<String> enabledTaskNames; @Bean public SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); // 用Map绑定任务名和对应触发器,不用关心顺序 Map<String, Trigger> taskTriggerMap = Map.of( "fp", fpCronTriggerFactoryBean().getObject(), "ps", psCronTriggerFactoryBean().getObject(), "ofb", ofbCronTriggerFactoryBean().getObject(), "mgl", mglCronTriggerFactoryBean().getObject() ); // 筛选需要开启的触发器 List<Trigger> enabledTriggers = enabledTaskNames.stream() .map(taskTriggerMap::get) .filter(Objects::nonNull) .toList(); schedulerFactoryBean.setTriggers(enabledTriggers.toArray(new Trigger[0])); return schedulerFactoryBean; }
内容的提问来源于stack exchange,提问作者user16750862
相关产品推荐
相关产品推荐

