
定時任務需求是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。開源且好評如潮。