quartz核心原理及实战使用

  1. 今日大纲
  1. 学习Quartz
  2. 基于Quartz实现定时关闭超时未付款的订单
  3. 基于Solr实现商品的搜索
    1. 爬虫抓到的京东的商品数据、图片
  4. Quartz
    1. 大纲
  • Quartz是什么?
  • 简单的一些例子
  • Quartz框架学习
    1. Quartz是什么

简单的认为Quartz是是一个定时器。

    1. 核心接口

    1. Tigger
  • SimpleTrigger
    • 简单的触发
  • CronTrigger
    • 表达式触发
      1. SimpleTrigger

 

      1. CronTrigger

    1. Cron Expressions

 

    1. 表达式生成工具

这个工具不完美:

  1. 缺少秒
  2. 缺少L、W表达式
  1. 学习Quartz
    1. 导入quartz

    1. 依赖

    1. 示例
      1. Job

public class HelloJob implements Job {

    private static Logger _log = LoggerFactory.getLogger(HelloJob.class);

    /**

     * <p>

     * Empty constructor for job initilization

     * </p>

     * <p>

     * Quartz requires a public empty constructor so that the

     * scheduler can instantiate the class whenever it needs.

     * </p>

     */

    public HelloJob() {

    }

    /**

     * <p>

     * Called by the <code>{@link org.quartz.Scheduler}</code> when a

     * <code>{@link org.quartz.Trigger}</code> fires that is associated with

     * the <code>Job</code>.

     * </p>

     * @throws JobExecutionException

     *             if there is an exception while executing the job.

     */

    public void execute(JobExecutionContext context)

        throws JobExecutionException {

        // Say Hello to the World and display the date/time

        _log.info("Hello World! - " + new Date());

    }

}

      1. 简单触发示例

public class SimpleExample {

    public void run() throws Exception {

        Logger log = LoggerFactory.getLogger(SimpleExample.class);

        log.info("------- Initializing ----------------------");

        // 定义调度器

        SchedulerFactory sf = new StdSchedulerFactory();

        Scheduler sched = sf.getScheduler();

        log.info("------- Initialization Complete -----------");

        // 获取当前时间的下一分钟

        Date runTime = evenMinuteDate(new Date());

        log.info("------- Scheduling Job  -------------------");

        // 定义job

        // quartz中,有组的概念,组+job名称 唯一的

        JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build();

        // 定义触发器,在下一分钟启动

        Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();

        // job注册到调度器

        sched.scheduleJob(job, trigger);

        log.info(job.getKey() + " will run at: " + runTime);

        // 启动调度器

        sched.start();

        log.info("------- Started Scheduler -----------------");

        // 等待65

        log.info("------- Waiting 65 seconds... -------------");

        try {

            // wait 65 seconds to show job

            Thread.sleep(65L * 1000L);

            // executing...

        } catch (Exception e) {

            //

        }

        // 关闭调度器

        log.info("------- Shutting Down ---------------------");

        sched.shutdown(true);

        log.info("------- Shutdown Complete -----------------");

    }

    public static void main(String[] args) throws Exception {

        SimpleExample example = new SimpleExample();

        example.run();

    }

}

      1. 表达式触发示例

public class SimpleCronExample {

    public void run() throws Exception {

        Logger log = LoggerFactory.getLogger(SimpleCronExample.class);

        log.info("------- Initializing ----------------------");

        // 定义调度器

        SchedulerFactory sf = new StdSchedulerFactory();

        Scheduler sched = sf.getScheduler();

        log.info("------- Initialization Complete -----------");

        // 获取当前时间的下一分钟

        Date runTime = evenMinuteDate(new Date());

        log.info("------- Scheduling Job  -------------------");

        // 定义job

        JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build();

        // 定义触发器,每2秒执行一次

        Trigger trigger = newTrigger().withIdentity("trigger1", "group1")

                .withSchedule(cronSchedule("0/5 * * * * ?")).build();

        // job注册到调度器

        sched.scheduleJob(job, trigger);

        log.info(job.getKey() + " will run at: " + runTime);

        // 启动调度器

        sched.start();

        log.info("------- Started Scheduler -----------------");

        // 等待1分钟

        log.info("------- Waiting 60 seconds... -------------");

        try {

            Thread.sleep(60L * 1000L);

        } catch (Exception e) {

            //

        }

        // 关闭调度器

        log.info("------- Shutting Down ---------------------");

        sched.shutdown(true);

        log.info("------- Shutdown Complete -----------------");

    }

    public static void main(String[] args) throws Exception {

        SimpleCronExample example = new SimpleCronExample();

        example.run();

    }

}

    1. 通过Spring使用Quartz
      1. 导入依赖

      1. 编写Job

      1. 编写配置文件文
  1. 定义job
  2. 定义触发
  3. 定义调度器,并且注册触发
      1. 启动Spring容器(启动调度器)

    1. 触发和job之间关系

一个触发能都多个job吗? 不能!

一个job能有多个触发吗? 是的!

  1. 关闭超时2天未付款的订单
    1. 分析
  1. 在订单系统中导入相关的依赖
  2. 定义job
    1. 扫描订单表,修改订单的状态为关闭状态
    2. 扫描条件:创建时间 <= 当前之间 – 2天 并且,付款方式为在线支付的订单
  3. 定义触发
    1. 理论上需要实时触发(性能问题)
    2. 1分钟触发一次
    1. 实现
      1. 导入依赖

      1. 定义job

      1. 定义触发

      1. 定义调度器

      1. OrderMapper中的实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值