spring定时任务详解(多任务处理)
Posted on: 2018-03-23, Last modified: 2018-03-23, View: 661

在springMVC里使用spring的定时任务非常的简单,如下:

(一)在xml里加入task的命名空间

 

[html] view plain copy
 
  1. xmlns:task="http://www.springframework.org/schema/task"   
  2. http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd  

(二)启用注解驱动的定时任务

 

 

[html] view plain copy
 
  1. <task:annotation-driven scheduler="myScheduler"/>   

(三)配置定时任务的线程池

推荐配置线程池,若不配置多任务下会有问题。后面会详细说明单线程的问题。

 

[html] view plain copy
 
  1. <task:scheduler id="myScheduler" pool-size="5"/>  

(四)写我们的定时任务

 

@Scheduled注解为定时任务,cron表达式里写执行的时机

[java] view plain copy
 
  1. package com.mvc.task.impl;  
  2. import java.text.DateFormat;  
  3. import java.text.SimpleDateFormat;  
  4. import java.util.concurrent.TimeUnit;  
  5. import org.joda.time.DateTime;  
  6. import org.springframework.scheduling.annotation.Scheduled;  
  7. import org.springframework.stereotype.Component;  
  8. import com.mvc.task.IATask;  
  9. @Component  
  10. public class ATask implements IATask{  
  11.        @Scheduled(cron="0/10 * *  * * ? ")   //每10秒执行一次      
  12.        @Override      
  13.        public void aTask(){      
  14.             try {  
  15.                 TimeUnit.SECONDS.sleep(20);  
  16.             } catch (InterruptedException e) {  
  17.                 e.printStackTrace();  
  18.             }  
  19.             DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    
  20.             System.out.println(sdf.format(DateTime.now().toDate())+"*********A任务每10秒执行一次进入测试");      
  21.        }      
  22. }    
[java] view plain copy
 
  1. package com.mvc.task.impl;  
  2. import java.text.DateFormat;  
  3. import java.text.SimpleDateFormat;  
  4. import org.joda.time.DateTime;  
  5. import org.springframework.scheduling.annotation.Scheduled;  
  6. import org.springframework.stereotype.Component;  
  7. import com.mvc.task.IBTask;  
  8. @Component  
  9. public class BTask implements IBTask{  
  10.        @Scheduled(cron="0/5 * *  * * ? ")   //每5秒执行一次      
  11.        @Override   
  12.        public void bTask(){     
  13.              DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    
  14.              System.out.println(sdf.format(DateTime.now().toDate())+"*********B任务每5秒执行一次进入测试");      
  15.        }      
  16. }  

spring的定时任务默认是单线程多个任务执行起来时间会有问题(B任务会因为A任务执行起来需要20S而被延后20S执行),如下图所示:



当我们配置了线程池后再来看结果(多线程下,B任务再也不会因为A任务执行起来要20S而被延后了):

 

From: https://blog.csdn.net/qq_33556185/article/details/51852537
Go
Friend Links:
Bill Site
https://item.taobao.com/item.htm?spm=a21an.7676007.1998473182.296.lAvrE2&id=45399580446