關於Jfinal自帶Cron4j的定時器使用實例

cron4j是Java平臺的一個調度器,使用cron4j你只需要制定一些簡單的規則,就可以在規定好的時間內執行你所指定的任務。本篇我們主要介紹cron4j在JFinal中的使用。

cron4j基本概念

主要步驟:

cron4j的主要對象爲scheduler(調度器)。

1. 我們在使用的時候需要先new一個scheduler實例。

2. 通過schedule方法添加實現了java.lang.Runnable接口的實例對象作爲要調度的任務(或是用cron4j提供的it.sauronsoftware.con4j.Task類來實例一個對象)。

3. 用一個時間字符串來代表指定的scheduling pattern(調度模式)指定任務在何時執行(或是使用一個it.sauronsoftware.cron4j.SchedulingPattern類的實例)。

4. 最後啓動scheduler。

  • 調度器可以安排任意數量的任務。
  • 可以在調度器運行的過程中,添加新的任務或是對已經在運行的任務進行修改、移除。\
  • 調度器可以開啓或停止任意次。

 MAVEN配置(pom.xml)

<dependency>
    <groupId>it.sauronsoftware.cron4j</groupId>
    <artifactId>cron4j</artifactId>
    <version>2.2.5</version>
    <scope>provided</scope>
</dependency>

新建JobBean

package utils;

public class JobBean {

    /** id */
    private String jobId;

    /** 類名 */
    private String jobClass;

    /** 時間表達式 */
    private String cronExpression;

    /** 任務名稱 */
    private String jobName;

    public String getJobId() {
        return jobId;
    }

    public void setJobId(String jobId) {
        this.jobId = jobId;
    }

    public String getJobClass() {
        return jobClass;
    }

    public void setJobClass(String jobClass) {
        this.jobClass = jobClass;
    }

    public String getCronExpression() {
        return cronExpression;
    }

    public void setCronExpression(String cronExpression) {
        this.cronExpression = cronExpression;
    }

    public String getJobName() {
        return jobName;
    }

    public void setJobName(String jobName) {
        this.jobName = jobName;
    }

    public JobBean(String jobId, String jobClass, String cronExpression, String jobName) {
        this.jobId = jobId;
        this.jobClass = jobClass;
        this.cronExpression = cronExpression;
        this.jobName = jobName;
    }

    public JobBean() {
        super();
    }
}

新建Cron4jPlugin工具類

package utils;

import com.jfinal.plugin.IPlugin;
import it.sauronsoftware.cron4j.InvalidPatternException;
import it.sauronsoftware.cron4j.Scheduler;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;

public class Cron4jPlugin implements IPlugin {

    // 任務調度器
    private static Scheduler scheduler = null;

    // 任務
    private static List<JobBean> jobs = new ArrayList<JobBean>();

    // 任務配置文件
    private String config = "job.properties";
    private Properties properties;

    public Cron4jPlugin(String config) {
        this.config = config;
    }

    public Cron4jPlugin() {

    }

    /**
     * 啓動任務調度器
     */
    public boolean start() {
        scheduler = new Scheduler();
        // 加載配置文件
        loadProperties();
        Enumeration enums = properties.keys();

        // 解析配置文件
        while (enums.hasMoreElements()) {
            String key = enums.nextElement() + "";
            if (!key.endsWith("job")) {
                continue;
            }
            String cronKey = key.substring(0, key.indexOf("job")) + "cron";
            String enable = key.substring(0, key.indexOf("job")) + "enable";
            String name = key.substring(0, key.indexOf("job")) + "name";
            // 判斷是否自啓動
            if (isDisableJob(enable)) {
                continue;
            }
            String jobClassName = properties.get(key) + "";
            String jobCronExp = properties.getProperty(cronKey) + "";
            String jobName = properties.getProperty(name) + "";
            Class clazz;
            try {
                clazz = Class.forName(jobClassName);
            } catch (ClassNotFoundException e) {
                throw new RuntimeException(e);
            }
            try {
                // 添加一個調度任務;任務創建成功後會返回一個String類型的id,後續可以通過這個id操作這個任務
                String jobId = scheduler.schedule(jobCronExp, (Runnable) clazz.newInstance());
                jobs.add(createJob(jobId,jobClassName,jobCronExp,jobName));
            } catch (InvalidPatternException e) {
                throw new RuntimeException(e);
            } catch (InstantiationException e) {
                throw new RuntimeException(e);
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            }
        }

        // 啓動調度器
        scheduler.start();

        return true;
    }

    private void loadProperties() {
        properties = new Properties();
        InputStream is = Cron4jPlugin.class.getClassLoader().getResourceAsStream(config);
        try {
            properties.load(is);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private boolean isDisableJob(String enable) {
        return Boolean.valueOf(properties.get(enable) + "") == false;
    }

    /**
     * 創建job
     * @param id id
     * @param className 類名
     * @param cron 時間表達式
     * @param name 任務
     * @return
     */
    private JobBean createJob(String id,String className,String cron,String name){
        JobBean job = new JobBean();
        job.setJobId(id);
        job.setJobClass(className);
        job.setCronExpression(cron);
        job.setJobName(name);
        return job;
    }


    /**
     * 停止任務
     * @param name 任務名
     * @return
     */
    public static boolean stopJob(String name) {

        for (JobBean job : jobs) {
            if(name.equals(job.getJobName())){
                scheduler.deschedule(job.getJobId());
                return true;
            }
        }
        return false;
    }

    /**
     * 停止任務調度器
     */
    public boolean stop() {
        scheduler.stop();
        return true;
    }
}

新建定時任務類test(Testjob.java)

package utils;

import com.jfinal.config.Plugins;

import java.util.Date;

public class Testjob implements Runnable {

    public void run() {
        System.out.println("Current system time: " + new Date());
        System.out.println("Another minute ticked away...");
    }

}

properties配置文件(job.properties)

#job:任務類
#cron:執行的時間表達式
#enable:是否自啓動
#name:任務名

task1.job=utils.Testjob
# 間隔時間
task1.cron=*/5 * * * * 
task1.enable=true
task1.name=task1

注意:job.properties 文件需要放在classpath下。

JFinal 核心類配置

JfinalConfigApiRun.java
@Override
public void configPlugin(final Plugins plugins) {
  log.info("測試定時器----------------------------------------------------------");
  plugins.add(new Cron4jPlugin());

}

全都配置完之後就可以用了,我的例子是每五分鐘執行一次。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章