zoukankan      html  css  js  c++  java
  • 关于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();
        }
    
    }
  • 相关阅读:
    ural 1146. Maximum Sum(动态规划)
    ural 1119. Metro(动态规划)
    ural 1013. K-based Numbers. Version 3(动态规划)
    Floyd算法
    杭电21题 Palindrome
    杭电20题 Human Gene Functions
    杭电15题 The Cow Lexicon
    杭电三部曲一、基本算法;19题 Cow Bowling
    杭电1002 Etaoin Shrdlu
    Qt 学习之路 2(37):文本文件读写
  • 原文地址:https://www.cnblogs.com/shej123/p/10248515.html
Copyright © 2011-2022 走看看