1. 程式人生 > >spring cron 定時任務

spring cron 定時任務

comm odin close -a html conn awk core www.

文章首發於個人博客:https://yeyouluo.github.io/

  • spring cron 定時任務

    0 預備知識:cron表達式

    見 《5 參考》一節。

    1 環境

    eclipse mars2 + Maven3.3.9

    2 開發步驟

    項目碼雲地址

    2.1 建立一個maven工程

    POM如下:

    技術分享
      1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    > 2 <modelVersion>4.0.0</modelVersion> 3 <groupId>com.yeyouluo.spring.timer</groupId> 4 <artifactId>spring-timer-demo</artifactId> 5 <version>0.0.1-SNAPSHOT</version> 6 7 <properties> 8 <spring.version>4.2.6.RELEASE</spring.version
    > 9 <slf4j.version>1.7.2</slf4j.version> 10 <log4j.version>1.2.17</log4j.version> 11 </properties> 12 13 <dependencies> 14 <dependency> 15 <groupId>org.slf4j</groupId> 16 <artifactId>slf4j-api</artifactId> 17 <version
    >${slf4j.version}</version> 18 </dependency> 19 <dependency> 20 <groupId>org.slf4j</groupId> 21 <artifactId>slf4j-log4j12</artifactId> 22 <version>${slf4j.version}</version> 23 </dependency> 24 <!-- common-logging 實際調用slf4j --> 25 <dependency> 26 <groupId>org.slf4j</groupId> 27 <artifactId>jcl-over-slf4j</artifactId> 28 <version>${slf4j.version}</version> 29 </dependency> 30 <!-- java.util.logging 實際調用slf4j --> 31 <dependency> 32 <groupId>org.slf4j</groupId> 33 <artifactId>jul-to-slf4j</artifactId> 34 <version>${slf4j.version}</version> 35 </dependency> 36 <dependency> 37 <groupId>log4j</groupId> 38 <artifactId>log4j</artifactId> 39 <version>${log4j.version}</version> 40 </dependency> 41 <dependency> 42 <groupId>org.lazyluke</groupId> 43 <artifactId>log4jdbc-remix</artifactId> 44 <version>0.2.7</version> 45 </dependency> 46 <!-- spring核心包 --> 47 <dependency> 48 <groupId>org.springframework</groupId> 49 <artifactId>spring-core</artifactId> 50 <version>${spring.version}</version> 51 </dependency> 52 <dependency> 53 <groupId>org.springframework</groupId> 54 <artifactId>spring-web</artifactId> 55 <version>${spring.version}</version> 56 </dependency> 57 <dependency> 58 <groupId>org.springframework</groupId> 59 <artifactId>spring-tx</artifactId> 60 <version>${spring.version}</version> 61 </dependency> 62 <dependency> 63 <groupId>org.springframework</groupId> 64 <artifactId>spring-jdbc</artifactId> 65 <version>${spring.version}</version> 66 </dependency> 67 <dependency> 68 <groupId>org.springframework</groupId> 69 <artifactId>spring-webmvc</artifactId> 70 <version>${spring.version}</version> 71 </dependency> 72 <dependency> 73 <groupId>org.springframework</groupId> 74 <artifactId>spring-aop</artifactId> 75 <version>${spring.version}</version> 76 </dependency> 77 <dependency> 78 <groupId>org.springframework</groupId> 79 <artifactId>spring-beans</artifactId> 80 <version>${spring.version}</version> 81 </dependency> 82 <dependency> 83 <groupId>org.springframework</groupId> 84 <artifactId>spring-context</artifactId> 85 <version>${spring.version}</version> 86 </dependency> 87 <dependency> 88 <groupId>org.springframework</groupId> 89 <artifactId>spring-context-support</artifactId> 90 <version>${spring.version}</version> 91 </dependency> 92 <dependency> 93 <groupId>org.springframework</groupId> 94 <artifactId>spring-expression</artifactId> 95 <version>${spring.version}</version> 96 </dependency> 97 <dependency> 98 <groupId>org.springframework</groupId> 99 <artifactId>spring-messaging</artifactId> 100 <version>${spring.version}</version> 101 </dependency> 102 <dependency> 103 <groupId>org.springframework.integration</groupId> 104 <artifactId>spring-integration-core</artifactId> 105 <version>4.2.5.RELEASE</version> 106 </dependency> 107 108 </dependencies> 109 110 <packaging>jar</packaging> 111 </project>
    POM.xml

    pom文件中可能加入了很多沒有使用的jar,比如和mybatis、druid、mysql-connector相關的jar,以備後用。

    2.2 添加配置文件

    ①log4j.properties

    技術分享
     1 log4j.rootLogger=INFO, Console, RollingFile
     2 #Console
     3 log4j.appender.Console=org.apache.log4j.ConsoleAppender
     4 log4j.appender.Console.layout=org.apache.log4j.PatternLayout
     5 log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
     6  
     7 #RollingFile
     8 log4j.appender.RollingFile=org.apache.log4j.DailyRollingFileAppender
     9  
    10 log4j.appender.RollingFile.File=logs/log.log
    11 log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout
    12 log4j.appender.RollingFile.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
    log4j.xml

    ②spring-base.xml

    技術分享
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4 xmlns:task="http://www.springframework.org/schema/task"
     5 xmlns:context="http://www.springframework.org/schema/context"
     6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
     7 http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd
     8 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
     9  
    10 <bean id="readDBTask" class="com.yeyouluo.spring.timer.service.ReadDBTask"></bean>
    11  
    12 <task:scheduled-tasks>
    13 <task:scheduled ref="readDBTask" method="doSomething" cron="0/3 * * * * ?"/>
    14 </task:scheduled-tasks>
    15  
    16 </beans>
    spring-base.xml

    註意引入命名空間
    xmlns:task=”http://www.springframework.org/schema/task“ 和
    http://www.springframework.org/schema/task
    http://www.springframework.org/schema/task/spring-task-3.0.xsd

    2.3 創建定時任務ReadDBTask

    技術分享
    1 package com.yeyouluo.spring.timer.service;
    2 import org.apache.log4j.Logger;
    3 public class ReadDBTask {
    4     public static Logger log = Logger.getLogger(ReadDBTask.class);
    5     public void doSomething() {
    6         log.info("********");
    7         log.info("定時任務執行。");
    8     }
    9 }
    ReadDBTask.java

    2.4 添加啟動函數Main

    技術分享
     1 package com.yeyouluo.spring.timer.start;
     2 import org.slf4j.Logger;
     3 import org.slf4j.LoggerFactory;
     4 import org.springframework.context.support.ClassPathXmlApplicationContext;
     5 public class Main {
     6     
     7     public static Logger logger = LoggerFactory.getLogger(Main.class);
     8     public static final String config = "spring-base.xml";
     9     
    10     public static void main(String[] args) {
    11         
    12         ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(config);
    13         logger.info("spring timer started");
    14         if( ctx != null ) {
    15             ctx.start();
    16         }
    17     }
    18 }
    Main.java

    3 流程分析

    在啟動函數Main.java右鍵 –> run as –> Java Application。
    結果為:每3秒在控制臺輸出如下:
    2017-10-16 15:03:54,885 [main] INFO [com.yeyouluo.spring.timer.start.Main] - spring timer started
    2017-10-16 15:03:57,002 [pool-1-thread-1] INFO [com.yeyouluo.spring.timer.service.ReadDBTask] - **
    2017-10-16 15:03:57,003 [pool-1-thread-1] INFO [com.yeyouluo.spring.timer.service.ReadDBTask] - 定時任務執行。
    2017-10-16 15:04:00,001 [pool-1-thread-1] INFO [com.yeyouluo.spring.timer.service.ReadDBTask] - **
    2017-10-16 15:04:00,001 [pool-1-thread-1] INFO [com.yeyouluo.spring.timer.service.ReadDBTask] - 定時任務執行。
    2017-10-16 15:04:03,001 [pool-1-thread-1] INFO [com.yeyouluo.spring.timer.service.ReadDBTask] - **
    2017-10-16 15:04:03,001 [pool-1-thread-1] INFO [com.yeyouluo.spring.timer.service.ReadDBTask] - 定時任務執行。
    2017-10-16 15:04:06,002 [pool-1-thread-1] INFO [com.yeyouluo.spring.timer.service.ReadDBTask] - **
    2017-10-16 15:04:06,002 [pool-1-thread-1] INFO [com.yeyouluo.spring.timer.service.ReadDBTask] - 定時任務執行。

    • 從入口函數開始,加載spring配置文件spring-base.xml。
    • spring-base.xml定義了 ,指向定時任務類com.yeyouluo.spring.timer.service.ReadDBTask的doSomething方法。
    • 執行doSomething方法中的邏輯。

    4 拓展:打成jar部署到單獨的服務器上

    目標:用java命令拉起程序。
    步驟
    ①將依賴jar提取出來,放入D:\timer\lib
    ②maven打包程序,將生成的jar放入D:\timer\lib
    ③在D:\timer\lib下新建一個文件start.cmd,內容如下:
    java -Djava.ext.dirs=D:\timer\lib -Xms1024m -Xmx1024m com.yeyouluo.spring.timer.start.Main
    ④雙擊start.cmd。
    結果
    技術分享

    部署在Linux上是一樣的操作,僅僅是替換啟動文件類型為.sh,並且內容中的路徑改為Linux的路徑。
    如果是部署在Linux服務器上,還可以編寫如下文件:
    stop.sh
    jps | grep Main | awk ‘{print $1}‘ | xargs kill -9
    註:通過kill進程的方式實現,不優雅。尤其要註意還沒有其他名稱為Main的進程,防止誤殺。

    clean-log.sh
    rm -f logs/*

    5 參考

    • Spring cron 表達式
    • Spring定時任務的幾種實現

spring cron 定時任務