spring中定時任務的多種實現


本文主要是記錄工作中所遇到的情況,並非教學!!! 

一、通過spring自帶的@Scheduled注解實現定時任務

1.更改ApplicationContext-mvc.xml/spring.xml 等配置文件,如果不知道自己應該配置哪個文件的話去web.xml中找到<servlet>標簽中的配置文件去配置就行(因為我試過配置在<context-param>標簽下的ApplicationContext.xml里面會報錯)

文件中需要更改的內容如下:

 

(1)xmlns:task="http://www.springframework.org/schema/task"

(2)xsi:schemaLocation中添加  (其中spring-task-3.1.xsd的版本可以更改看你的spring版本)具體參考下圖

 

 

 

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

 

 1 <beans xmlns="http://www.springframework.org/schema/beans"
 2  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3  xmlns:context="http://www.springframework.org/schema/context"
 4  xmlns:aop="http://www.springframework.org/schema/aop"
 5  xmlns:mvc="http://www.springframework.org/schema/mvc"
 6  xmlns:task="http://www.springframework.org/schema/task"
 7  xsi:schemaLocation="http://www.springframework.org/schema/beans  8  http://www.springframework.org/schema/beans/spring-beans.xsd  9  http://www.springframework.org/schema/aop 10  http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 11  http://www.springframework.org/schema/context 12  http://www.springframework.org/schema/context/spring-context.xsd 13  http://www.springframework.org/schema/mvc 14  http://www.springframework.org/schema/mvc/spring-mvc.xsd 15 http://www.springframework.org/schema/task 16 http://www.springframework.org/schema/task/spring-task-3.1.xsd">

(3)添加 task標簽設置 ,可以詳細配置也可以直接默認

多的部分是對與線程池的設置,配置線程池后如果多個定時任務同時執行也沒問題,不配置的話spring默認是單線程模式

1 <!--形式一-->
2 <task:executor id="executor" pool-size="5" />
3 <task:scheduler id="scheduler" pool-size="10" />
4 <task:annotation-driven executor="executor" scheduler="scheduler" />
5 
6 
7 <!--形式二-->
8  <task:annotation-driven />

(4)不要忘記配置你要執行的自動化程序所在的包的路徑,將該包的路徑加入掃描(按照自身實際情況配置)

<context:component-scan base-package="com.project.*" />

2.創建你的定時任務程序

 1 /**
 2  * @author 
 3  * @Time 2020-07-08 17:07  4  */
 5 //必須添加注解交由spring管控才能生效
 6 @Component  7 public class ScheduledDemo {  8     //由於將整個類交由spring管控不必擔心@Autowired注解失效的情況
 9  @Autowired 10     private TestService testService; 11 
12     //有點缺點該注解只支持6位參數的cron表達式不支持7位的
13     @Scheduled(cron = "0 0/1 * * * ? ") 14     public void aaa(){ 15         //實現你需要的方法即可
16  testService.XXX(); 17         System.out.println("哈哈哈哈"); 18  } 19 
20 }    

 

二、通過quartz組件實現定時任務(有點問題按照網上的方法最后我也沒成功納入spring管理。。。)

1.通過官網下載quartz ,下載完成是下圖的壓縮包 解壓后相應目錄下有你需要的jar包,自行導入即可(其他的都是依賴jar包,最低情況只需要導入quartz自身的兩個jar就行)

 

 

 

配置一下日志打印(依賴於log4j組件)

  

 2.此處就不講quartz怎么使用了,結合網上的分享,這里提供一個工具類方便直接調用

 1 /**
 2  * @author 
 3  * @Time 2020-07-06 17:00
 4  */
 5 public class SchedulerUtil {
 6     private static Logger logger = Logger.getLogger(SchedulerUtil.class);// log4j記錄日志
 7     /**
 8      * [簡單任務調度:每次執行間隔為多少毫秒,執行多少次] <br>
 9      * @param jobName 任務名字
10      * @param jobGroupName 任務組名字
11      * @param triggerName 觸發器名字
12      * @param triggerGroupName 觸發器組名字
13      * @param jobClass 任務類
14      * @param time 時間間隔
15      * @param count 執行幾次<br>
16      */
17     public static void handleSimpleTrigger(String jobName, String jobGroupName,
18                                            String triggerName, String triggerGroupName, Class jobClass,
19                                            int time, int count) {28         // 通過schedulerFactory獲取一個調度器
29         SchedulerFactory schedulerfactory = new StdSchedulerFactory();
30         Scheduler scheduler = null;
31         try {
32             // 通過schedulerFactory獲取一個調度器
33             scheduler = schedulerfactory.getScheduler();
34             // 創建jobDetail實例,綁定Job實現類
35             // 指明job的名稱,所在組的名稱,以及綁定job類
36             JobDetail job = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
37             // 定義調度觸發規則
38             //使用simpleTrigger規則
39             Trigger trigger=TriggerBuilder.newTrigger().withIdentity(triggerName,triggerGroupName)
40                     .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(time).withRepeatCount(count))
41                     .build();
42             // 把作業和觸發器注冊到任務調度中
43             scheduler.scheduleJob(job, trigger);
44             // 啟動調度
45             scheduler.start();
46         } catch (Exception e) {48             logger.error("執行"+jobName+"組"+jobName+"任務出現異常E:["+ e.getMessage() + "]");
49         }
50     }
51     /**
52      * [復雜任務調度:每天幾點幾分幾秒定時執行任務] <br>
53      * @param jobName 任務名字
54      * @param jobGroupName 任務組名字
55      * @param triggerName 觸發器名字
56      * @param triggerGroupName 觸發器組名字
57      * @param jobClass 任務類
58      * @param cron 觸發規則<br>
59      */
60     /**
61      *
62      *
63      */
64     public static void hadleCronTrigger(String jobName, String jobGroupName,
65                                         String triggerName, String triggerGroupName, Class jobClass,String cron) {73         // 通過schedulerFactory獲取一個調度器
74         SchedulerFactory schedulerfactory = new StdSchedulerFactory();
75         Scheduler scheduler = null;
76         try {
77             // 通過schedulerFactory獲取一個調度器
78             scheduler = schedulerfactory.getScheduler();
79             // 創建jobDetail實例,綁定Job實現類
80             // 指明job的名稱,所在組的名稱,以及綁定job類
81             JobDetail job = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
82             // 定義調度觸發規則
83             //使用cornTrigger規則  每天18點30分
84             Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroupName)
85                     .withSchedule(CronScheduleBuilder.cronSchedule(cron))
86                     .build();
87             // 把作業和觸發器注冊到任務調度中
88             scheduler.scheduleJob(job, trigger);
89             // 啟動調度
90             scheduler.start();
91         } catch (Exception e) {93             logger.error("執行" + jobName + "組" + jobName + "任務出現異常E:[" + e.getMessage() + "]");
94         }
95     }
96 }

3.方式一  :創建自己的job類,然后通過@PostConstruct注解在項目啟動后調用(配合第二條使用)

/**
 * @author 
 * @Time 2020-07-06 17:40
 */
@DisallowConcurrentExecution //不允許job並發執行,防止重復調用,只對於同一實例有效,不同jobDetails引用同一個job時不起作用
public class TPersonFollowUpJob implements Job {

    @Autowired
    private TestService testService;

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

//因為沒有被納入spring管理,所以這里通過這個方法實現調用spring管理的組件讓該頁面的@Autowired 注解生效   SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
        //自己要實現的方法
        testService.XXX();
        System.out.println("哈哈哈哈");
    }
}

下面是調用方法

//該注解保證了該方法可以在程序啟動后自動調用執行一次    
@PostConstruct
    public void start(){
        //這里使用我們前面定義好的工具類來調用我們的Job方法類,這里的cron表達式支持最多7位參數    
        SchedulerUtil.hadleCronTrigger("任務名字", "任務組名字","觸發器名字", "觸發器組名字", TPersonFollowUpJob.class,"0 0/1 * * * ? *");
    }

4.方式二  :直接通過spring的xml配置完成(在web.xml的<context-param>標簽下的ApplicationContext.xml中進行配置,別的位置會報錯),獨立使用

 1 <!--定時器任務配置(開始) -->
 2     <!--配置JOB -->
 3     <!--TPersonFollowUpTasksService這個bean是為了指定你早已經寫好的為了定時執行的方法所在的實現類 -->
 4     <bean id="TPersonFollowUpTasksService" class="com.msunsoft.service.personMana.Impl.TPersonFollowUpTasksServiceImpl"></bean>
 5     <bean id="JobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
 6         <property name="targetObject">
 7             <ref bean="TPersonFollowUpTasksService" />
 8         </property>
 9         <property name="targetMethod">
10 <!--在這里指定需要定時執行的方法名-->
11             <value>createFollowUpTasks</value>
12         </property>
13         <property name="concurrent">
14             <value>false</value>
15         </property>
16     </bean>
17     <!--配置Trigger -->
18     <bean id="deleteDataTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
19         <property name="jobDetail">
20             <ref bean="JobDetail" />
21         </property>
22         <property name="cronExpression">
23             <!-- 這里支持7個參數的corn表達式  每個小時的每分鍾執行一次 -->
24             <value>0 0/1 * * * ? *</value>
25         </property>
26     </bean>
27     <!--配置Scheduler -->
28     <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false" autowire="no">
29         <property name="triggers">
30             <list>
31                 <ref bean="deleteDataTrigger" />
32             </list>
33         </property>
34         <property name="autoStartup">
35             <value>true</value>
36         </property>
37     </bean>
38     <!--定時器任務配置(結束) -->

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM