为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

回首忆惘然 2022-05-25 15:36:43
我有一个使用的 Spring 应用程序@SpringBootApplication和@EnableScheduling在主java中。它还有一个包含多个 @Scheduled 方法的类:@Componentpublic 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 手动创建它?如何?
查看完整描述

2 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

注释被认为是代码的元数据。您不应该与注释交互 - 只有提供库应该。但只需将感兴趣的 cron 表达式外部化并在其他地方阅读即可。


@Scheduled(cron = "${yourConfiguration.cronExpression}")

someMethod()...


@Value("${yourConfiguration.cronExpression}")

String cronExpression;  // injected for debugging purposes

您还可以获取 TaskScheduler 并使其列出所有任务,包括所有 cron 表达式。但这将超出您所讨论方法的范围。


查看完整回答
反对 回复 2022-05-25
?
白衣非少年

TA贡献1155条经验 获得超0个赞

从 Spring 5.0.2开始,它允许在运行时获取调度任务信息:


我目前将其作为 ScheduledAnnotationBeanPostProcessor 上的 Set getScheduledTasks() 方法,ScheduledTask 现在公开了一个 Task getTask() 方法。然后您可以检查任务的类型,为了更容易发现,我还引入了特定的 FixedRateTask 和 FixedDelayTask 子类,然后您可以在 CronTask 旁边检查它们,不需要任务实例本身之外的任何额外元数据。


我再过一遍;今晚承诺。


ScheduledTask都存储在beanScheduledAnnotationBeanPostProcessor中。您可以从此 bean 获取它们并将其转换为CronTask以获取 cron 表达式:


@Component

public class SchedulederInfo {


   @Autowired

   private ScheduledAnnotationBeanPostProcessor scheduledBpp;


   public void printInfo(){

        for(ScheduledTask task : scheduledBpp.getScheduledTasks()) {

          Task t = task.getTask();

          if(t instanceof CronTask) {

              CronTask cronTask = (CronTask)t;

              System.out.println(cronTask.getRunnable());   //print the schedule method name 

              System.out.println(cronTask.getExpression()); //print the cron expression

          }

   }

}


查看完整回答
反对 回复 2022-05-25
  • 2 回答
  • 0 关注
  • 89 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信