Java 如何在Spring的运行时获得@schedule指定的方法的cron指定?
我有一个Spring应用程序,它使用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 ? * *")
@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
}
}
}