如何在运行时表示Spring <task:scheduled>对象?

Dav*_*arr 13 spring

我有一个使用"task:scheduler"和"task:scheduled-tasks"元素的应用程序(后者包含"task:scheduled"元素).这一切都很好.

我正在尝试编写一些内省"应用程序配置"的代码,以获得一些重要信息的简短摘要,例如安排的任务以及他们的日程安排.

我已经有一个有一堆"@Autowired"实例变量的类,所以我可以遍历所有这些.很容易添加"List"来获取所有TaskScheduler对象.我只有两个,我在每个任务中都有一组不同的计划任务.

我在那些TaskScheduler对象中看不到的东西(它们实际上是ThreadPoolTask​​Scheduler对象)看起来像是一个计划任务列表,所以我猜测计划任务列表会记录在其他地方.

我可以使用哪些对象来内省计划任务集以及它们所在的线程池?

Tob*_*s M 14

此功能将在Spring 4.2中提供

https://jira.spring.io/browse/SPR-12748(免责声明:我报告了此问题并为其解决方案提供了代码).

// Warning there may be more than one ScheduledTaskRegistrar in your
// application context. If this is the case you can autowire a list of 
// ScheduledTaskRegistrar instead.
@Autowired   
private ScheduledTaskRegistrar scheduledTaskRegistrar; 

public List<Task> getScheduledTasks() {
    List<Task> result = new ArrayList<Task>();
    result.addAll(this.scheduledTaskRegistrar.getTriggerTaskList());
    result.addAll(this.scheduledTaskRegistrar.getCronTaskList());
    result.addAll(this.scheduledTaskRegistrar.getFixedRateTaskList());
    result.addAll(this.scheduledTaskRegistrar.getFixedDelayTaskList());
    return result;
}

// You can this inspect the tasks, 
// so for example a cron task can be inspected like this:

public List<CronTask> getScheduledCronTasks() {
    List<CronTask> cronTaskList = this.scheduledTaskRegistrar.getCronTaskList();
    for (CronTask cronTask : cronTaskList) {
        System.out.println(cronTask.getExpression);
    }
    return cronTaskList;
}
Run Code Online (Sandbox Code Playgroud)

如果您使用的是XML中定义的ScheduledMethodRunnable:

<task:scheduled method="run" cron="0 0 12 * * ?" ref="MyObject" />
Run Code Online (Sandbox Code Playgroud)

您可以访问基础目标对象:

 ScheduledMethodRunnable scheduledMethodRunnable = (ScheduledMethodRunnable) task.getRunnable();
 TargetClass target = (TargetClass) scheduledMethodRunnable.getTarget();
Run Code Online (Sandbox Code Playgroud)

  • @ngeek我已经提交了一个公关来解决这个问题,看看它是否会被接受.https://github.com/spring-projects/spring-framework/pull/878 https://jira.spring.io/browse/SPR-13506 (2认同)

Sot*_*lis 0

每个 Spring XML 元素都有一个对应的BeanDefinitionReader. 对于<task:scheduled-tasks>,那就是ScheduledTasksBeanDefinitionParser

这使用 a为类型为 的 beanBeanDefinitionBuilder创建 a 。您的计划任务将存储在该 bean 中。BeanDefinitionContextLifecycleScheduledTaskRegistrar

这些任务将按照默认值或您提供的值执行TaskScheduler

我已经给了您类名称,因此如果您需要更细粒度的细节,您可以自己查看源代码。