Spring Task基于配置文件的任务定义
1、定义任务执行类
package cn.liang.forget; import java.text.SimpleDateFormat; public class TaskDemo3{ public void task(){ System.out.println("【当前日期时间】" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new java.util.Date())); } }2、修改applicationContext.xml配置文件
xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.3.xsd"配置间隔触发
<bean id="TaskDemo3" class="cn.liang.forget.TaskDemo3"/> <task:scheduled-tasks> <task:scheduled ref="TaskDemo3" method="task" fixed-rate="2000"/> </task:scheduled-tasks>配置cron定时触发
<bean id="TaskDemo3" class="cn.liang.forget.TaskDemo3"/> <task:scheduled-tasks> <task:scheduled ref="TaskDemo3" method="task" cron="* * * * * ?"/> </task:scheduled-tasks>3、启动Spring容器实现间隔触发任务
package cn.liang.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TaskTest2 { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); } }
Spring Task基于Annotation的配置
1、修改applicationContext.xml配置文件
xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.3.xsd" <task:annotation-driven/> <context:annotation-config/> <context:component-scan base-package="cn.liang"/>2、配置间隔触发代码
package cn.liang.forget; import java.text.SimpleDateFormat; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class TaskDemo3{ @Scheduled(fixedRate=2000) public void task(){ System.out.println("【当前日期时间】" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new java.util.Date())); } }3、配置cron定时触发
package cn.liang.forget; import java.text.SimpleDateFormat; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class TaskDemo3{ @Scheduled(cron="* * * * * ?") public void task(){ System.out.println("【当前日期时间】" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new java.util.Date())); } }
Spring Task任务调度池
- 之前都只是实现单个的任务配置,如果是多任务则会按顺序执行
- 此状态下,所有的任务的执行就像队列一样依次向下执行每一个具体的任务
- 但是如果其中一个任务执行的时间比较长,容易影响到另外一个任务的执行
- 因此需要建议建立一个任务调度池
- 任务调度池使得所有的任务不再是单线程的形式完成,属于多线程的方式
1、编写测试代码
任务A代码
package cn.liang.forget; import java.text.SimpleDateFormat; import org.springframework.scheduling.annotation.Scheduled; @Component public class TaskDemo2{ @Scheduled(fixedRate=2000) public void runJob() { System.out.println("【TaskDemoA - 当前日期时间】" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new java.util.Date())); } }任务B代码
package cn.liang.forget; import java.text.SimpleDateFormat; import java.util.concurrent.TimeUnit; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class TaskDemo3{ @Scheduled(cron="* * * * * ?") public void task(){ try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("【TaskDemoB - 当前日期时间】" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new java.util.Date())); } }2、修改applicationContext.xml配置文件
<task:scheduler id="schedulerPool" pool-size="20"/>3、启动Spring容器实现间隔触发任务
package cn.liang.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TaskTest2 { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); } }4、输出结果
【MyTaskA - 当前日期时间】2018-12-04 16:33:17.899 【MyTaskA - 当前日期时间】2018-12-04 16:33:19.892 【MyTaskA - 当前日期时间】2018-12-04 16:33:21.889 【MyTaskB - 当前日期时间】2018-12-04 16:33:23.011 【MyTaskA - 当前日期时间】2018-12-04 16:33:23.890 【MyTaskA - 当前日期时间】2018-12-04 16:33:25.889 【MyTaskA - 当前日期时间】2018-12-04 16:33:27.892 【MyTaskB - 当前日期时间】2018-12-04 16:33:29.005 【MyTaskA - 当前日期时间】2018-12-04 16:33:29.888 【MyTaskA - 当前日期时间】2018-12-04 16:33:31.891 【MyTaskA - 当前日期时间】2018-12-04 16:33:33.891