Spring的定时任务Quartz的实现

Quartz定时任务

  • 开发的过程中,有些场景会用到定时器,遇到了分享出来给大家。

Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,完全由Java开发,可以用来>执行定时任务,类似于java.util.Timer。但是相较于Timer, Quartz增加了很多功能:

  • 持久性作业 - 就是保持调度定时的状态
  • 作业管理 - 对调度作业进行有效的管理;

基本的组成部分:

  • 调度器:Scheduler
  • 任务:JobDetail
  • 触发器:Trigger,包括SimpleTrigger和CronTrigger

关于Quartz具体的详情信息,可自行详情度娘。

直接上代码

  • 1:创建定时任务(Demo)===>里面书写你要写的定时执行的代码
  • 2:需要实现Job里面的方法
package org.java.admin.manage.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
 * @program: lb-manage
 * @description   定时任务
 * @author: LiuBao
 * @create: 2020-07-30 10:03
 **/
public class ChargeTask implements Job {

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
             System.out.println("定时器被执行了");
    }
}

  • 1:封装一个定时工具类
  • 2:代码详情如下
package org.java.admin.manage.quartz;

import com.sun.corba.se.spi.presentation.rmi.PresentationManager;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.util.Date;
import java.util.Map;

/**
 * @program: lb-manage
 * @description
 * @author: LiuBao
 * @create: 2020-07-30 10:06
 **/
public class ChargeTriggerUtil {

    /**
     * 创建定时任务
     * @param job
     * @param map
     * @param key
     * @param date
     */
    public static void createTask(Job job, Map<String, Object> map, String key, Date date) throws SchedulerException {
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        scheduler.start();
        //创建唯一标识
        JobKey jobKey = new JobKey(key);
        //数据传输
        JobDataMap jobDataMap = new JobDataMap(map);
        JobDetail jobDetail = JobBuilder.newJob(job.getClass()).withIdentity(jobKey).setJobData(jobDataMap).build();
        SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity(key).startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).repeatForever()).build();

        scheduler.scheduleJob(jobDetail, trigger);
    }

    /**
     * 删除定时任务
     * @param key
     */
    public static void deleteTask(String key) {
        Scheduler scheduler = null;
        try {
            scheduler = new StdSchedulerFactory().getScheduler();
            scheduler.deleteJob(new JobKey(key));
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
}

  • 测试 如下
package org.java.admin.manage.quartz;

import org.quartz.SchedulerException;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @program: lb-manage
 * @description
 * @author: LiuBao
 * @create: 2020-07-30 10:38
 **/
public class TaskTest {
    public static void main(String[] args) {
        Map<String, Object>  map = new HashMap<>();
        try {
        // 创建定时器
            ChargeTriggerUtil.createTask(new ChargeTask(), map,"55" ,new Date());
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
}

package org.java.admin.manage.quartz;

import java.util.HashMap;
import java.util.Map;

/**
 * @program: lb-manage
 * @description
 * @author: LiuBao
 * @create: 2020-07-30 10:38
 **/
public class TaskTest2 {
    public static void main(String[] args) {
    // 删除定时器
        Map<String, Object>  map = new HashMap<>();
        ChargeTriggerUtil.deleteTask("55");
    }
}

还有一个问题,在Job里面的方法里,无法注入Bean的问题,解决方案如下
这个SpringUtils 必须得在包下能被扫描到,这个配置才生效

package com.shopx5.socket.config;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class SpringUtils implements ApplicationContextAware {
    private static ApplicationContext applicationContext=null;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringUtils.applicationContext=applicationContext;
    }

    public static ApplicationContext getApplicationContext(){
        return SpringUtils.applicationContext;
    }

    public static <T>T getBean(Class<T> clazz) {
        return applicationContext.getBean(clazz);
    }
}

讲一下在Job中,如果拿到Bean

package org.java.admin.manage.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
 * @program: lb-manage
 * @description   定时任务
 * @author: LiuBao
 * @create: 2020-07-30 10:03
 **/
public class ChargeTask implements Job {

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
    //拿到Bean的方法	
     UserCoinWalletMapper userCoinWalletMapper = SpringUtils.getBean(UserCoinWalletMapper.class);
             System.out.println("定时器被执行了");
    }
}
  • 还有的就是传参问题 (JobDataMap 可以来传参数)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值