如何在 Spring 运行时获取使用 @schedule 注释的方法的 cron 注释?

我有一个使用的 Spring 应用程序


@SpringBootApplication


@EnableScheduling

在主java中。它还有一个包含多个 @Scheduled 方法的类:


@Component


public class ScheduledTasks {


(...)


@Scheduled(cron = "0 0/5 10-18 ? * *")    

public void doThings() {

(...)

}


@Scheduled(cron = "0 0/22 23 ? * *")    

public void doAnotherThings() {

(...)

}

据我所知,它没有声明任何特殊的线程池、ThreadPoolExecutor 或类似的东西。该应用程序运行正常,计划的作业运行正常。


我想在运行时获取 @Scheduled 注释的值,只是想知道 cron 何时定义并向用户显示信息。


无需向调度程序更改或添加新任务/作业。


我一直在尝试这个答案 中的一些想法 Spring <task:scheduled> 对象在运行时是如何表示的? 尝试获取自动装配的 ThreadPoolExecutor 或 ThreadPoolTaskExecutor,然后尝试查看该对象的字段是否具有有用的信息,但使用 Autowired 获取它们总是在应用程序启动时失败。


我的应用程序在启动“没有找到用于计划处理的 TaskScheduler/ScheduledExecutorService bean”时还说,所以我想它使用默认/简单的方式来运行计划的方法,它们工作正常。


我不知道是否有必要在 @Configuration 类中手动创建带有该对象的 @Bean 以自省它,或者如何填充与它们关联的构造函数。


哪些对象具有与计划作业相关的信息?


我可以在自己的课堂上自动连接它以获取信息吗?


是否需要在 Spring 中使用 @Bean 手动创建它?如何?


回首忆惘然
浏览 90回答 2
2回答

GCT1015

注释被认为是代码的元数据。您不应该与注释交互 - 只有提供库应该。但只需将感兴趣的 cron 表达式外部化并在其他地方阅读即可。@Scheduled(cron = "${yourConfiguration.cronExpression}")someMethod()...@Value("${yourConfiguration.cronExpression}")String cronExpression;&nbsp; // injected for debugging purposes您还可以获取 TaskScheduler 并使其列出所有任务,包括所有 cron 表达式。但这将超出您所讨论方法的范围。

白衣非少年

从 Spring 5.0.2开始,它允许在运行时获取调度任务信息:我目前将其作为 ScheduledAnnotationBeanPostProcessor 上的 Set getScheduledTasks() 方法,ScheduledTask 现在公开了一个 Task getTask() 方法。然后您可以检查任务的类型,为了更容易发现,我还引入了特定的 FixedRateTask 和 FixedDelayTask 子类,然后您可以在 CronTask 旁边检查它们,不需要任务实例本身之外的任何额外元数据。我再过一遍;今晚承诺。ScheduledTask都存储在beanScheduledAnnotationBeanPostProcessor中。您可以从此 bean 获取它们并将其转换为CronTask以获取 cron 表达式:@Componentpublic class SchedulederInfo {&nbsp; &nbsp;@Autowired&nbsp; &nbsp;private ScheduledAnnotationBeanPostProcessor scheduledBpp;&nbsp; &nbsp;public void printInfo(){&nbsp; &nbsp; &nbsp; &nbsp; for(ScheduledTask task : scheduledBpp.getScheduledTasks()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Task t = task.getTask();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(t instanceof CronTask) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CronTask cronTask = (CronTask)t;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(cronTask.getRunnable());&nbsp; &nbsp;//print the schedule method name&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(cronTask.getExpression()); //print the cron expression&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp;}}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java