spring mvc controller不起作用_Spring 整合任務排程功能
技術標籤:spring mvc controller不起作用
優質文章,及時送達
作者 | 靜默虛空
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介面的實現類
它有三個實現類:DefaultManagedTaskScheduler
、ThreadPoolTaskScheduler
、TimerManagerTaskScheduler
。
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