spring cron 定時任務
文章首發於個人博客: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"
POM.xmlpom文件中可能加入了很多沒有使用的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.xsd2.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.java2.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.java3 流程分析
在啟動函數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.shjps | grep Main | awk ‘{print $1}‘ | xargs kill -9
註:通過kill進程的方式實現,不優雅。尤其要註意還沒有其他名稱為Main的進程,防止誤殺。clean-log.sh
rm -f logs/*
5 參考
- Spring cron 表達式
- Spring定時任務的幾種實現
spring cron 定時任務