1. 程式人生 > >淺談spring配置定時任務的幾種方式

淺談spring配置定時任務的幾種方式

property span 文件 觸發器 cron artifact 今天 方式 cap

網上看到好多關於定時任務的講解,以前只簡單使用過註解方式,今天項目中看到基於配置的方式實現定時任務,自己做個總結,作為備忘錄吧。

基於註解方式的定時任務

  首先spring-mvc.xml的配置文件中添加約束文件

xmlns:task="http://www.springframework.org/schema/task" 
http://www.springframework.org/schema/task  
http://www.springframework.org/schema/task/spring-task-3.2.xsd 

其次需要配置註解驅動

<task:annotation-driven />

添加你添加註解的掃描包

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

最後貼上定時任務包代碼

package com.xxx.xxx;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class xxxTask {
    @Scheduled(cron = "0/5 * * * * ? ") //
間隔5秒執行 public void xxx() { System.out.println("----定時任務開始執行-----"); //執行具體業務邏輯---------- System.out.println("----定時任務執行結束-----"); } }

基於配置的定時任務調度框架Quartz

引入依賴

<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>

  定義一個類,方法可以寫多個為需要定時執行的任務

public class AdminJob {
    
    public void job1() {
        System.out.pringln("執行了任務---");
    }
}

在spring.xml配置中添加

 <bean id="adminJob" class="com.xxx.xxx.AdminJob"/>
    <!--此處id值為需要執行的定時任務方法名-->
    <bean id="job1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="adminJob"/>
        <property name="targetMethod" value="job1"/>
    </bean>
<!--此處為定時任務觸發器--> <bean id="job1Trigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail"> <ref bean="job1"/> </property> <property name="cronExpression"> <value>0 15 0 16 * ?</value> </property> </bean>
<bean id="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="job1Trigger"/>
        </list>
    </property>
    <property name="taskExecutor" ref="executor"/>
</bean>
    <bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <property name="corePoolSize" value="10"/>
        <property name="maxPoolSize" value="100"/>
        <property name="queueCapacity" value="500"/>
    </bean>

最後還有一種普通java的定時任務代碼 基於線程池的方式實現定時任務

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Task3 {
  public static void main(String[] args) {
    Runnable runnable = new Runnable() {
      public void run() {
        // task to run goes here
        System.out.println("Hello !!");
      }
    };
    ScheduledExecutorService service = Executors
                    .newSingleThreadScheduledExecutor();
    service.scheduleAtFixedRate(runnable, 0, 1, TimeUnit.SECONDS);
  }
}

淺談spring配置定時任務的幾種方式