Spring中的多个计划任务调用

时间:2015-05-29 13:42:51

标签: java spring spring-mvc scheduled-tasks

我在beans.xml中为Spring scheduled-tasks提供了以下配置:

<task:scheduled-tasks>
    <task:scheduled ref="beanA" method="A" cron="0 0 0/1 * * *" />
    <task:scheduled ref="beanA" method="B" cron="0 0 0/5 * * *"/>
</task:scheduled-tasks>

我希望第一个计划任务始终在第二个计划之前运行。当我运行当前代码时,第二个任务首先运行,导致很少的并发问题。是否定义了优先级结构或可用于定义此类层次结构的标记/标识?

1 个答案:

答案 0 :(得分:0)

您可以使用 Quartz 调度程序,它可以完全满足您的要求。阅读 this 文章,了解一步一步的步骤。

或者,您可能希望将这些任务转换为 Spring Batch 作业。来自文档:

  

Spring Batch提供了可重复使用的功能,这些功能对于处理大量记录至关重要,包括记录/跟踪,事务管理,作业处理统计,作业重启,跳过和资源管理。

虽然安排两个小任务可能有点过头了。

第三种选择是使用java ThreadPoolExecutor 。您可以提供自己的任务队列以供其内部使用,并且不应直接与队列交互。

您可以使用自定义PriorityBlockingQueue构建的Comparator返回首先执行的任务。

来自 documentation

@Configuration
@EnableScheduling
public class AppConfig implements SchedulingConfigurer {
 @Override
 public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
     taskRegistrar.setScheduler(taskExecutor());
 }
 @Bean(destroyMethod="shutdown")
 public Executor taskExecutor() {
     return new ThreadPoolExecutor(1, 2, 10, TimeUnit.SECONDS, new PriorityBlockingQueue<Runnable>(20, new Comparator<Runnable2>() {
         @Override
         public int compare(Runnable2 o1, Runnable2 o2) {
             return o1.getPriority().compareTo(o2.getPriority());
         }
     }));
 }
}