spring內部有一個task是Spring自帶的一個設定時間自動任務調度
task使用的時候很方便,但是他能做的東西不如quartz那麼的多!
可以使用註解和配置兩種方式,配置的方式如下
引入Spring放在appcation.xml開頭
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:task="http://www.springframework.org/schema/task"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
- http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
- http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd"
- default-lazy-init="true">
<!-- 註冊bean -->
- <bean id="voiceFileClearJob" class="com.zjr.modules.boss.job.VoiceFileClearJob" />
- <bean id="versionListenJob" class="com.zjr.modules.boss.job.VersionListenJob" />
- <bean id="statJob" class="com.zjr.modules.opstat.job.StatJob" />
<!-- 開啓任務調度 -->
- <task:scheduled-tasks>
- <task:scheduled ref="voiceFileClearJob" method="execute" initial-delay="5000" fixed-delay="3600000"/>
- <task:scheduled ref="versionListenJob" method="execute" initial-delay="5000" fixed-delay="5000"/>
- <task:scheduled ref="statJob" method="statLgj" cron="0 59 23 * * ?"/>
- <task:scheduled ref="statJob" method="statBadNameAndQQ" cron="23 28 20 * * ?"/>
- </task:scheduled-tasks>
第一個任務表示程序啓動5s後調用voiceFileClearJob類中的execute方法,然後每隔一個小時再調用execute一次
第三個任務表示每天的23點59分調用statJob類中的statLgj方法
ref是工作類
method是工作類中要執行的方法
initial-delay是任務第一次被調用前的延時,單位毫秒
fixed-delay是上一個調用完成後再次調用的延時
fixed-rate是上一個調用開始後再次調用的延時(不用等待上一次調用完成)
cron是表達式,表示在什麼時候進行任務調度。
以下爲上述versionListenJob類的代碼,實現的功能是監控某個文件夾,如果該文件夾裏面的內容有任何改動,就重新生成一個txt文件,文件記錄的是該文件夾所有文件的相關信息。
- package com.zjr.modules.boss.job;
- import ...
- public class VersionListenJob {
- Logger logger = LoggerFactory.getLogger(VersionListenJob.class);
- private static final String GMBOSS_DIR = "/data/jweb_static/jweb_wb_mgmt_beta/gmboss/";
- private static final String GMBOSS_VERSION_TXT_FILE = "/data/jweb_static/jweb_wb_mgmt_beta/txt/version.txt";
- private static final String DOWNLOAD_URL = "http://beta.wbmgmt.youzijie.com/gmboss/";
- private Map<String, String> versionInfoMap = new HashMap<>();
- private File dir = new File(GMBOSS_DIR);
- private File versionTxt = new File(GMBOSS_VERSION_TXT_FILE);
- public VersionListenJob() {
- try {
- init();
- } catch (IOException e) {
- logger.error("error occurs during VersionListenJob", e);
- }
- }
- private void init() throws IOException {
- if (!versionTxt.exists())
- versionTxt.createNewFile();
- for (String line : FileUtils.readLines(versionTxt)) {
- String[] array = StringUtils.split(line, "|");
- if (array.length == 5)
- versionInfoMap.put(array[0], array[4]);
- }
- }
- public void execute() throws IOException {
- if (EnvironmentUtil.isLocal() || !dir.exists() || !dir.isDirectory()) {
- return;
- }
- //是否有文件更新
- Boolean needUpdate = false;
- List<File> allFiles = getFiles(dir.getAbsolutePath());
- for (File file : allFiles) {
- String filePath = file.getPath();
- long lastModifiedTime = file.lastModified();
- if (!StringUtils.equals(lastModifiedTime + "", versionInfoMap.get(filePath))) {
- needUpdate = true;
- break;
- }
- }
- if (needUpdate) {
- List<String> list = new ArrayList<>();
- for (File file : allFiles) {
- list.add(file.getAbsolutePath().replace(GMBOSS_DIR,"/") + "|"
- + md5(file) + "|"
- + file.getPath().replace(GMBOSS_DIR,DOWNLOAD_URL) + "|"
- + file.length() + "|"
- + file.lastModified());
- }
- FileUtils.writeLines(versionTxt,"UTF-8", list, IOUtils.LINE_SEPARATOR_WINDOWS,false);
- logger.info("VersionListenJob: Gmboss has been updated");
- }
- }
- //遞歸獲取目錄下的所有文件列表
- public List<File> getFiles(String filePath) throws IOException {
- List<File> allFiles = new ArrayList<>();
- File root = new File(filePath);
- File files[] = root.listFiles();
- if (files != null && files.length != 0) {
- for (File file : files) {
- if (file.isDirectory()) {
- allFiles.addAll(getFiles(file.getAbsolutePath()));
- } else {
- allFiles.add(file);
- }
- }
- }
- return allFiles;
- }
- public String md5(File f) {
- MessageDigest md = null;
- try {
- md = MessageDigest.getInstance("MD5");
- } catch (NoSuchAlgorithmException ne) {
- ne.printStackTrace();
- }
- if (md == null)
- return null;
- FileInputStream fis = null;
- try {
- fis = new FileInputStream(f);
- byte[] buffer = new byte[8192];
- int length;
- while ((length = fis.read(buffer)) != -1) {
- md.update(buffer, 0, length);
- }
- return new String(Hex.encodeHex(md.digest())).toUpperCase();
- } catch (Exception e) {
- logger.error("error occurs during md5 file", e);
- return null;
- } finally {
- try {
- if (fis != null)
- fis.close();
- } catch (IOException e) {
- logger.error("error occurs during md5 file", e);
- }
- }
- }
- }