quartz+cron表达式实现定时调度任务

想起之前做项目得时候写过定时调度任务,这里做一下记录以后用到的时候方便查阅

语法上来说还是比较简单的底层实际上是基于反射的,关于反射属于基础范围不做阐述。

相关依赖

    <!-- quartz -->
   <dependencycs>
    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>2.2.0</version>
    </dependency>
     <dependency>
     <groupId>org.jodd</groupId>
        <artifactId>jodd-all</artifactId>
        <version>5.0.13</version>
    </dependency></dependencycs>
           

相关业务代码

启动监听

    public class TimeTaskListener implements ServletContextListener {
            @Override
    public void contextInitialized(ServletContextEvent sce) {
        // TODO Auto-generated method stub
        if(taskSwitch) {
            //每日定时任务启动
            ScheduleCommonByDayLoad.run();
         
        }
    }
    //销毁
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // TODO Auto-generated method stub
        if(taskSwitch) {
        
            //销毁每日定时 任务
            ScheduleCommonByDayLoad.stop();
        }
    }
    
            }

业务绑定类

有关定时调度任务的具体的类

 package ***.***.***.***.***.quartz.regular;
			import org.apache.log4j.Logger;
		import org.quartz.*;
		import org.quartz.impl.StdSchedulerFactory;
	/**
		* 每日调度的执行 类
		*/
public class ScheduleCommonByDayLoad {

    //定时调度接口'
    private static Scheduler sched;

    private static Logger log = Logger.getLogger(ScheduleCommonByDayLoad.class);
    static{
        //创建工厂调度
        SchedulerFactory sfact = new StdSchedulerFactory();
        try{
            sched = sfact.getScheduler();
        }catch (Exception e){
            e.printStackTrace();
            log.error("创建定时调度计划对象异常,报错栈:" + e.toString());
        }
    }

    /**
      执行方法
        每天24点执行 一次   0 0 23 * * ?   测试每5秒钟执行一次
     	cron表达式基本的规则为 秒分时日月周年 可以百度一下,在线生成
     */
    public  static  void run(){
        log.error("==每日定时调度启动====");
        try {
            JobDetail jobDetail = JobBuilder.newJob((Class<? extends Job>) ScheduleCommonByDayJob.class)
                    .withIdentity("dayJob", "group10").build();
            CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger", "group10")
                    // 每一分钟
                    .withSchedule(CronScheduleBuilder.cronSchedule("0 1 0 * * ?")).build();
            sched.start();
            sched.scheduleJob(jobDetail, trigger);
        }catch (Exception e){
            e.printStackTrace();
            log.error("每日定时器异常。");
            log.error("每日定时器报错栈:" + e.toString());
        }

    }

    //结束方法
    public  static void stop(){
        log.error("每日调度定时器销毁");
        try{
            sched.shutdown();
        }catch (Exception e){
            e.printStackTrace();
            log.error("每日定时器异常停止,报错找:"+e.toString());
        }
    }

}

代码绑定

/  代码绑定
package ***.***.****.***.**.quartz;

import org.apache.log4j.Logger;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

/**
* 定时调用邮箱读取job
*
* @author ***
*
*/
public class ScheduleReadEmailLoad {

    // 定时调度接口
    private static Scheduler sched;

    private static Logger log = Logger.getLogger(ScheduleReadEmailLoad.class);

    static {

        // 创建调度工厂对象
        SchedulerFactory sfact = new StdSchedulerFactory();
        try {

            sched = sfact.getScheduler();

        } catch (Exception e) {
            e.printStackTrace();
            log.error("创建定时调度计划对象异常,报错栈:" + e.toString());
        }
    }

    // 执行方法
    public static void run() {

        log.error("====读取邮箱定时器启动====");

        try {
            JobDetail jobDetail = JobBuilder.newJob((Class<? extends Job>) ScheduleReadEmailJob.class)
                    .withIdentity("emailJob", "group1").build();
            CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger", "group1")
                    .withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * * * ?")).build();// 每一分钟

            sched.start();
            sched.scheduleJob(jobDetail, trigger);

        } catch (Exception e) {
            // TODO: handle exception
            log.error("读取邮箱定时器异常。");
            log.error("读取邮箱定时器报错栈:" + e.toString());
        }

    }

    // 结束方法
    public static void stop() {
        log.error("====读取邮箱定时器销毁====");
        try {
            sched.shutdown();
        } catch (SchedulerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            log.error("定时器停止异常,报错栈:" + e.toString());
        }
    }

}

附带cron在线生成表达式的地址https://cron.qqe2.com/

后面有空的话会继续更新一些工作中遇到的问题和解决方法~~~·

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Java可以使用cron表达式实现定时任务cron表达式由7个时间元素组成,分别为秒、分、时、日期、月份、星期几和年份。其中,年份是可选的,一般不需要指定。Spring 4.x的Spring Task只支持前6个时间元素,而Quartz框架则支持完整的7个时间元素。 下面是一个使用Java实现定时任务的示例代码: ```java import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; public class CronScheduler { public static void main(String[] args) throws SchedulerException { // 创建调度器 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // 创建任务 JobDetail job = JobBuilder.newJob(MyJob.class).build(); // 创建触发器,使用cron表达式 Trigger trigger = TriggerBuilder.newTrigger() .withSchedule(CronScheduleBuilder.cronSchedule("0 0 12 * * ?")) // 每天中午12点执行 .build(); // 将任务和触发器绑定到调度器 scheduler.scheduleJob(job, trigger); // 启动调度器 scheduler.start(); } } public class MyJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { // 在这里写你的定时任务逻辑 System.out.println("定时任务执行了"); } } ``` 上述代码中,首先创建了一个调度器对象,然后创建了一个任务对象(实现了Job接口),并创建了一个触发器对象,通过`withSchedule`方法传入cron表达式来指定任务执行的时间。最后,将任务和触发器绑定到调度器,并启动调度器。 以上就是使用Java实现定时任务的简单示例。你可以根据需要自定义定时任务的逻辑和cron表达式实现不同的定时功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值