天天看點

springmvc的定時任務

springmvc的定時任務

定時任務需求是springmvc提供的一個常見功能,但是配置特别繁瑣,本文将介紹如何配置并且使用定時任務。

1.配置定時任務

需要在spring-mvc的配置檔案中加入以下配置。

<task:executor id="executor" pool-size="10" queue-capacity="128" />
    <task:scheduler id="scheduler" pool-size="10" />
    <task:annotation-driven executor="executor"
        scheduler="scheduler" proxy-target-class="true" />      

注意:需要在xml引用上加入以下頭資訊,否則會報異常。

<!-- 任務線程池 -->    
<!-- 任務執行器線程數量(一個任務需要并發執行的線程數) --> 
xmlns:task="http://www.springframework.org/schema/task
<!-- 任務排程器線程數量(根據定時器的個數設定) --> 
http://www.springframework.org/schema/task             
<!-- 啟用annotation 識别@Scheduled注解-->       
http://www.springframework.org/schema/task/spring-task-3.0.xsd      

在使用時,直接使用@Scheduled注解即可,可以按照下文編寫。

@Component
public class SchedulingConfigN {
private static final Logger LOG = LoggerFactory.getLogger(SchedulingConfigN.class);
    @Scheduled(cron = "0/20 * * * * ?") /從第0秒開始,每隔20秒執行一次 從前往後分别是 秒 分 時 日 月 年
                                                                // 如果一個小時執行一次就是 0 0 */1 * * ?
                                                                // 每天的11點執行一次 0 0 11 * * ?
    public void scheduing() {
        System.out.println("定時任務啟動1111");       
    }
}      

2.從資料庫擷取定時任務執行頻率

上文配置有一個問題,就是如果想更改執行的頻率,需要更改代碼,然後打包,才能生效。那麼是否能在資料庫中配置執行頻率,通過修改資料庫就能夠更改呢。下文提供代碼供大家參考。

@Configuration
@EnableScheduling
public class JobConfig implements SchedulingConfigurer {

    @Autowired
    @Qualifier("timingTasks")
    TimingTasks timingTasks;

    //擷取定時任務的時間service
    @Bean(name={"timingTasks"})
    public TimingTasks timingTasks() {
        return new TimingTasks();
    }

    /**
     * 執行定時任務.
     */
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(
            // 1.添加任務内容(Runnable)
            () -> System.out.println("執行定時任務2: " + LocalDateTime.now().toLocalTime()),
            // 2.設定執行周期(Trigger)
            triggerContext -> {
                // 2.1 從資料庫擷取執行周期
                System.out.println("開始執行");
                List<SaleProductFileBO> resultBO = timingTasks.selectTimingTasks(Long.valueOf(2));
                //擷取定時任務的時間
                String cron = resultBO.get(0).getFiles();
                // 2.3 傳回執行周期(Date)
                return new CronTrigger(cron).nextExecutionTime(triggerContext);
            });
    }

}
      
如果大家生産環境有該需求,建議了解和使用xxl-job。開源且好評如潮。