任务调度 Spring Task 4(二 )
注解和配置文件两种
第一种:配置文件方式
第一步:编写作业类
即普通的pojo,如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import org.springframework.stereotype.Service; 2 @Service 3 public class TaskJob { 4 5 public void job1() { 6 System.out.println(“任务进行中。。。”); 7 } 8 }
第二步:在spring配置文件头中添加命名空间及描述
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <</span>beans xmlns="http://www.springframework.org/schema/beans" 2 xmlns:task="http://www.springframework.org/schema/task" 3 。。。。。。 4 5 http://www.springframework.org/schema/task 6 http://www.springframework.org/schema/task/spring-task.xsd 7 >
第三步:spring配置文件中设置具体的任务
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <</span>task:scheduled-tasks> 2 <</span>task:scheduled ref="taskJob" method="job1" cron="0 * * * * ?"/> 3 </</span>task:scheduled-tasks> 4 5 <</span>context:component-scan base-package=" cn.springmvc" />
第四步:启动测试
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package cn.springmvc.quartz; 2 import org.springframework.context.ApplicationContext; 3 import org.springframework.context.support.ClassPathXmlApplicationContext; 4 5 public class StartConfig { 6 public static void main(String[] args){ 7 System.out.println("启动spring容器"); 8 ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); 9 } 10 }
二:annotation 注解配置
第一步:配置测试类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package cn.springmvc.quartz; 2 3 import org.springframework.scheduling.annotation.Scheduled; 4 import org.springframework.stereotype.Component; 5 6 @Component("annotationTask") 7 public class AnnotationTask { 8 @Scheduled(cron="0/5 * * * * ? ") //每5秒执行一次 9 public void job1() { 10 System.out.println("spring task 注解使用。。。任务进行中"); 11 } 12 }
第二步: 配置配置文件:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 http://www.springframework.org/schema/task 2 http://www.springframework.org/schema/task/spring-task.xsd 3 。。。 4 5 <</span>task:annotation-driven scheduler="qbScheduler" mode="proxy"/> // 理论上只需要这么一句就可以了 6 <</span>task:scheduler id="qbScheduler" pool-size="10"/>
第三步:启动测试
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package cn.springmvc.quartz; 2 import org.springframework.context.ApplicationContext; 3 import org.springframework.context.support.ClassPathXmlApplicationContext; 4 5 public class StartConfig { 6 public static void main(String[] args){ 7 System.out.println("启动spring容器"); 8 ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); 9 } 10 }
实现TaskScheduler 接口的ThreadPoolTaskExecutor 继承关系。
ThreadPoolTaskExecutor 是TaskExecutor 的最主要实现类之一。该类的核心继承关系如下图所示。
ThreadPoolTaskExecutor 接口扩展了重多的接口,让其具备了更多的能力。要实现异步需要标注@Async 注解:
- AsyncTaskExecutor 增加了返回结果为Future 的submit() 方法,该方法的参数为Callable 接口。相比Runnable 接口,多了将执行结果返回的功能。
- AsyncListenableTaskExecutor 接口允许返回拥有回调功能的ListenableFuture 接口,这样在结果执行完毕是,能够直接回调处理。