Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Spring的运行时获得@schedule指定的方法的cron指定?_Java_Spring_Cron_Scheduled Tasks - Fatal编程技术网

Java 如何在Spring的运行时获得@schedule指定的方法的cron指定?

Java 如何在Spring的运行时获得@schedule指定的方法的cron指定?,java,spring,cron,scheduled-tasks,Java,Spring,Cron,Scheduled Tasks,我有一个Spring应用程序,它使用 @SpringBootApplication 及 在主java中。 此外,它还有一个包含多个@Scheduled方法的类: @Component public class ScheduledTasks { (...) @Scheduled(cron = "0 0/5 10-18 ? * *") public void doThings() { (...) } @Scheduled(cron = "0 0/22 23 ? * *")

我有一个Spring应用程序,它使用

@SpringBootApplication

在主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 anotion的值,只是想知道cron是何时定义的,并向用户显示信息

无需更改或向计划程序添加新任务/作业

我一直在尝试这个答案中的一些想法 正在尝试自动连线 线程池执行器或 ThreadPoolTaskExecutor,然后尝试查看该对象的字段是否包含有用信息 但是,当应用程序启动时,使用Autowired获取它们总是失败的

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

我不知道是否有必要在@Configuration类中手动创建一个带有该对象的@Bean来监视它,或者如何填充与之相关的构造函数

该信息与计划作业关联的对象是什么

我可以在我自己的类中自动连接它以获取信息吗

是否有必要在Spring中使用@Bean手动创建它?怎么做


非常感谢。

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

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

@Value("${yourConfiguration.cronExpression}")
String cronExpression;  // injected for debugging purposes
您还可以获得TaskScheduler并使其列出所有任务,包括所有cron表达式。但这将超出所讨论方法的上下文。

自Spring以来,它允许在运行时获取调度任务信息:

我目前已将其作为一组getScheduledTasks()获取 方法,该方法位于ScheduledNotationBeanPostProcessor上,带有ScheduledTask 现在公开Task getTask()方法。您可以检查 然后,为了更容易发现,我还介绍了特定的 然后可以检查FixedRateTask和FixedDelayTask子类 对于下一个CronTask,不需要任务之外的任何额外元数据 实例本身

我会让它再通过一次;今晚将被交付

ScheduledTask
存储在
scheduledNotationBeanPostProcessor
bean中。您可以从这个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
          }
   }
}

为什么不把这些字符串带到
应用程序.properties
?非常感谢,Ken,但不幸的是,我的项目使用的是较旧版本的Spring(4.3.7)。很遗憾,因为您的解决方案似乎简单且正确。非常感谢。@LewisB,听到这个消息很难过。不过,如果你觉得我的答案对你有用的话,请随时更新我的答案:PI更新了你的答案,ken chan和Mick。但是我的低声望并没有改变你的答案。但我感谢你们两位,感谢你们的回答,感谢你们的时间。谢谢将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
          }
   }
}