java - spring boot调度在方法级别启用/禁用任务
问题描述
我正在按照本指南开始在 Spring Boot https://spring.io/guides/gs/scheduling-tasks/中安排任务。
我想为同一个类中的不同任务添加更多方法,想知道是否可以通过属性启用/禁用方法级别的任务,并且@ConditionalOnProperty
似乎@ConditionalOnProperty
仅适用于类级别,而不是方法级别(根据下面的代码示例,它不起作用)。任何替代方法?还是必须创建另一个包含任务二的类才能分别禁用/启用它们?
@Component
public class SchedulingTasks {
private static final Logger log = LoggerFactory.getLogger(SchedulingTasks.class);
@Scheduled(fixedRate = 50000)
public void jobOne() {
log.info("job one started at {}", LocalDateTime.now());
}
@Scheduled(fixedRate = 50000)
@ConditionalOnProperty(name="job.two", havingValue="true")
public void jobTwo() {
log.info("just two started at {}", LocalDateTime.now());
}
}
解决方案
您可以应用于@ConditionalOnProperty
方法和类型,但似乎这只适用于注册 Bean 的方法(请参阅@Conditional
文档)。
您应该创建单独的 Bean,您可以在其中使用 @ConditionalOnProperty 控制注册,然后将@Scheduled
注释应用于 Bean 中的方法。
例子:
@Slf4j
@Service
@ConditionalOnProperty(prefix = "schedule", name = {"job.one"}, havingValue = "true")
public class JobOneScheduler {
@Scheduled(cron = "*/2 * * * * *")
public void runJob() {
log.debug( "Running job one... {}", LocalDateTime.now() );
}
}
@Slf4j
@Service
@ConditionalOnProperty(prefix = "schedule", name = {"job.two"}, havingValue = "true")
public class JobTwoScheduler {
@Scheduled(cron = "*/5 * * * * *")
public void runJob() {
log.debug( "Running job two... {}", LocalDateTime.now() );
}
}
应用程序属性:
schedule.job.one=true
schedule.job.two=false
推荐阅读
- json - Nifi:流内容(动态json格式)到csv
- c - C:从文件中读取整数并存储在指针数组中
- css - 用于登录页面的 Angular 条件 CSS
- javascript - 无法从javascript中的子类访问父类变量
- scala - Scala:函数值的eta扩展(不是方法)
- google-oauth - 尝试使用第三方身份提供者和授权码授权从 IdentityServer 获取访问令牌时授权无效
- java - ReflectionTestUtils 设置带有返回 NPE 的弹簧值注释的字段
- java - 使用 'extract' 方法迭代地从最小堆中删除最小元素并复制到指定的 arrayList 作为获取排序列表的方法
- python - 具有最小/最大(间隔)的部分依赖图,而不仅仅是 Python 中的平均值
- ios - 在 Test Flight 测试后提交应用到 App Store