關於cron4j的使用


cron4j的主要實體是調度程序。使用it.sauronsoftware.cron4j.scheduler實例,您可以在一年中的固定時間執行任務。調度程序可以每分鍾執行一次任務,每五分鍾執行一次,星期五10:00,2月16日12:30,但僅限於星期六,依此類推。可惜沒有設置到秒的操作。

使用cron4j調度程序是一個四步操作:

創建調度程序實例。

安排你的行動。要計划一個操作,您必須告訴調度程序它必須做什么以及何時做。可以指定使用java.lang.runnable或it.sauronsoftware.cron4j.task實例的內容,也可以指定何時使用可以用字符串或it.sauronsoftware.cron4j.scheduling pattern實例表示的計划模式。

官方案例:

import it.sauronsoftware.cron4j.Scheduler;

public class Quickstart {

    public static void main(String[] args) {
        // Creates a Scheduler instance.
        Scheduler s = new Scheduler();
        // Schedule a once-a-minute task.
        s.schedule("* * * * *", new Runnable() {
            public void run() {
                System.out.println("Another minute ticked away...");
            }
        });
        // Starts the scheduler.
        s.start();
        // Will run for ten minutes.
        try {
            Thread.sleep(1000L * 60L * 10L);
        } catch (InterruptedException e) {
            ;
        }
        // Stops the scheduler.
        s.stop();
    }

}

 

其他一些關鍵概念:

您可以計划需要多少任務。

您可以在需要時調度一個任務,也可以在調度程序啟動之后。

也可以在調度程序正在運行時(重新調度操作)更改已調度任務的調度模式。

也可以在計划程序運行時刪除以前計划的任務(取消計划操作)。

您可以啟動和停止一個調度程序多少次。

您可以從一個文件調度。

您可以從任何源進行計划。

您可以向調度程序提供偵聽器,以便接收有關已執行任務的事件。

您可以控制任何正在進行的任務。

您可以手動啟動任務,而不使用計划模式。

您可以更改計划程序工作時區。

在將調度模式與調度程序一起使用之前,可以驗證調度模式。

您可以預測調度模式何時會導致任務執行。

 

我做了以下調試,執行順序還是需要多動手測試才行。

import com.jiangge.utils.task.TaskRunner;

import it.sauronsoftware.cron4j.Scheduler;
import it.sauronsoftware.cron4j.Task;
import it.sauronsoftware.cron4j.TaskExecutionContext;

/**
 * 
 * @author Uboobo
 * 
 * 定時任務,目前有兩種框架,一個是corn4j,一個是quartz
 * 
 * 這里我們分別做下介紹
 * 
 * corn4j其本身不支持秒,可以通過修改其源文件重新打包來實現支持,其默認規則如下
 * 分:從0到59
 * 時:從0到23
 * 天:從1到31,字母L可以表示月的最后一天
 * 月:從1到12,可以別名:"jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov" and "dec"
 * 周:從 0 到 6,0 表示周日,6 表示周六,可以使用別名: "sun", "mon", "tue", "wed", "thu", "fri" and "sat"
 * 
 * 數字 n:表示一個具體的時間點,例如 5 * * * * 表示 5 分這個時間點時執行
 * 逗號 , :表示指定多個數值,例如 3,5 * * * * 表示 3 和 5 分這兩個時間點執行
 * 減號 -:表示范圍,例如 1-3 * * * * 表示 1 分、2 分再到 3 分這三個時間點執行
 * 星號 *:表示每一個時間點,例如 * * * * * 表示每分鍾執行
 * 除號 /:表示指定一個值的增加幅度。例如 * /5表示每隔5分鍾執行一次(序列:0:00, 0:05, 0:10, 0:15 等等)。
 * 再例如3-18/5 * * * * 是指在從3到18分鍾值這個范圍之中每隔5分鍾執行一次(序列:0:03, 0:08, 0:13, 0:18, 1:03, 1:08 等等)。
 *
 */

public class TimerTask
{

    public static void taskRunner(Object task)
    {

    // 創建一個 Scheduler 實例.
    Scheduler s = new Scheduler();
    
    if (task instanceof Runnable) {
        System.out.println("Runnable");
        s.schedule("*/1 * * * *", (Runnable) task);
    } else if (task instanceof Task) {
        System.out.println("task");
        s.schedule("*/1 * * * *", (Task) task);
    }
    // 自身調度執行一個任務
//    s.schedule("*/1 * * * *", new Runnable() 
//    {
//        public void run()
//        {
//        System.out.println("自我調用");
//        }
//    });
    s.schedule("*/1 * * * *", new MyTaskrun());
    s.schedule("*/1 * * * *", new MyTask());
    // Starts the scheduler.
    s.start();
    // Will run for 1 minutes.
    try
    {
        System.out.println("try");
        Thread.sleep(1000L * 60L * 1L);
    } catch (InterruptedException e)
    {
        System.out.println(e);
    }
    // Stops the scheduler.
    s.stop();
    System.out.println("stop");
    }
    public static void setTask()
    {
    // 創建一個 Scheduler 實例.執行多任務
    Scheduler s = new Scheduler();
    s.schedule("/1 * * * *", new MyTaskrun());
    s.schedule("/1 * * * *", new MyTask());
    s.start();
    try
    {
        Thread.sleep(1000L * 60L * 1L);
    } catch (InterruptedException e)
    {
        System.out.println(e);
    }
    // Stops the scheduler.
    //s.stop();
    }
    
    //通過使用實現接口的方式,定時執行任務
     static class MyTaskrun implements Runnable{

        public void run() {

         System.out.println("123");

        }
     }
   //通過繼承Task的方式,定時執行任務
     static class MyTask extends Task{

        @Override
            public void execute(TaskExecutionContext arg0) throws RuntimeException
            {
         System.out.println("456");
            }
     }
     public static void main(String [] args)
    {
    /*MyTask myTask = new MyTask();
     System.out.println("start");
     taskRunner(myTask);
     System.out.println("next start");
     MyTaskrun myTaskrun = new MyTaskrun();
     taskRunner(myTaskrun);*/
     setTask();
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM