1. 程式人生 > 其它 >spring mvc controller不起作用_Spring 整合任務排程功能

spring mvc controller不起作用_Spring 整合任務排程功能

技術標籤:spring mvc controller不起作用

優質文章,及時送達

80ab6a735b0ec3580465a4ce4c424490.png

作者 | 靜默虛空

https://github.com/dunwu/spring-tutorial

概述

如果想在Spring中使用任務排程功能,除了整合排程框架Quartz這種方式,也可以使用Spring自己的排程任務框架。

使用Spring的排程框架,優點是:支援註解@Scheduler,可以省去大量的配置。

實時觸發排程任務

TaskScheduler介面

Spring3引入了TaskScheduler介面,這個介面定義了排程任務的抽象方法。

TaskScheduler介面的宣告:

public interface TaskScheduler {

ScheduledFuture schedule(Runnable task, Trigger trigger);

ScheduledFuture schedule(Runnable task, Date startTime);

ScheduledFuture scheduleAtFixedRate(Runnable task, Date startTime, long period);

ScheduledFuture scheduleAtFixedRate(Runnable task, long period);

ScheduledFuture scheduleWithFixedDelay(Runnable task, Date startTime, long delay);

ScheduledFuture scheduleWithFixedDelay(Runnable task, long delay);

}

從以上方法可以看出TaskScheduler有兩類重要引數:

  • 一個是要排程的方法,即一個實現了Runnable介面的執行緒類的run方法;

  • 另一個就是觸發條件。

TaskScheduler介面的實現類

它有三個實現類:DefaultManagedTaskSchedulerThreadPoolTaskSchedulerTimerManagerTaskScheduler

  • DefaultManagedTaskScheduler:基於JNDI的排程器。

  • TimerManagerTaskScheduler

    :託管commonj.timers.TimerManager例項的排程器

  • ThreadPoolTaskScheduler:提供執行緒池管理的排程器,它也實現了TaskExecutor介面,從而使的單一的例項可以儘可能快地非同步執行。

Trigger介面

Trigger介面抽象了觸發條件的方法。

Trigger介面的宣告:

public interface Trigger {
Date nextExecutionTime(TriggerContext triggerContext);
}

Trigger介面的實現類

CronTrigger:實現了cron規則的觸發器類(和Quartz的cron規則相同)。

PeriodicTrigger:實現了一個週期性規則的觸發器類(例如:定義觸發起始時間、間隔時間等)。

完整範例

實現一個排程任務的功能有以下幾個關鍵點:

(1) 定義排程器

在spring-bean.xml中進行配置

使用task:scheduler標籤定義一個大小為10的執行緒池排程器,spring會例項化一個ThreadPoolTaskScheduler

<?xml version="1.0" encoding="UTF-8"?>
www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.1.xsd">

注:不要忘記引入xsd:

http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.1.xsd

(2) 定義排程任務

定義實現Runnable介面的執行緒類。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

publicclassDemoTaskimplementsRunnable{
final Logger logger = LoggerFactory.getLogger(this.getClass);

@Override
publicvoidrun {
logger.info("call DemoTask.run");
}
}

(3) 裝配排程器,並執行排程任務

在一個Controller類中用@Autowired註解裝配TaskScheduler

然後調動TaskScheduler物件的schedule方法啟動排程器,就可以執行排程任務了。

@Controller
@RequestMapping("/scheduler")
public class SchedulerController {
@Autowired
TaskScheduler scheduler;

@RequestMapping(value = "/start