zoukankan      html  css  js  c++  java
  • Quartz框架定时器实现

    最近因为项目要实现重点区域实时人流量统计,因涉及到AI领域,所以系统先已定时器的方式,定时推送数据。

    1、创建CronTriggerExample。此处实现两个定时任务。

    package com.troy.emergency.monitor.web.rest;
    
    import org.quartz.*;
    import org.quartz.impl.StdSchedulerFactory;
    import org.springframework.stereotype.Component;
    
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    
    /**
     * @Author: CaoTing
     * @Description:  启动定时任务
     * @Date: 2019/8/22
     */
    @Component
    public class CronTriggerExample implements ServletContextListener {
    
        @Override
        public void contextInitialized(ServletContextEvent servletContextEvent) {
            try {
                servletContextEvent.getServletContext().log("定时器已启动");
                //人流
                JobKey jobKeyA = new JobKey("JobFlowPerson", "group1");
                JobDetail jobA = JobBuilder.newJob(QuartzJobFlowPerson.class).withIdentity(jobKeyA).build();
                //实时人员轨迹
                JobKey jobKeyB = new JobKey("JobPatrolPlanChildLocus", "group2");
                JobDetail jobB = JobBuilder.newJob(QuartzJobPlanChildLocus.class).withIdentity(jobKeyB).build();
                Scheduler scheduler = new StdSchedulerFactory().getScheduler();
                scheduler.start();
                scheduler.scheduleJob(jobA, QuartzJobFlowPerson.getJobFlowPersonTrigger());
                scheduler.scheduleJob(jobB, QuartzJobPlanChildLocus.getJobPatrolPlanChildLocusTrigger());
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public void contextDestroyed(ServletContextEvent sce) {
    
        }
    
    }

    2、创建Job。

    (1)QuartzJobFlowPerson

    package com.troy.emergency.monitor.web.rest;
    
    import com.troy.emergency.monitor.service.FlowPersonService;
    import com.troy.emergency.monitor.utils.ApplicationContextProvider;
    import com.troy.emergency.monitor.utils.DateFormatUtils;
    import lombok.extern.log4j.Log4j;
    import org.quartz.*;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.annotation.Resource;
    import java.util.Calendar;
    import java.util.Date;
    
    
    /**
     * @Author: CaoTing
     * @Description:  人流任务
     * @Date: 2019/8/22
     */
    @Log4j
    @RestController
    public class QuartzJobFlowPerson implements Job {
    
        @Resource
        private FlowPersonService flowPersonService;
    
        @Override
        public void execute(JobExecutionContext context) throws JobExecutionException {
            try {
                //人流量
                this.flowPersonService = ApplicationContextProvider.getBean(FlowPersonService.class);
                flowPersonService.addFlowPerson();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static Trigger getJobFlowPersonTrigger(){
            try {
                //获取当前时间的整点
                Calendar ca = Calendar.getInstance();
                ca.set(Calendar.MINUTE, 0);
                ca.set(Calendar.SECOND, 0);
                Date sTime = ca.getTime();
                Date eTime= DateFormatUtils.StringToDate("2020-12-31 23:59:59","yyyy-MM-dd HH:mm:ss");
                SimpleScheduleBuilder scheduleBuilder=SimpleScheduleBuilder.simpleSchedule().withIntervalInHours(2).repeatForever();
                return TriggerBuilder.newTrigger().withIdentity("flowPersonJob","group1").startAt(sTime).endAt(eTime).withSchedule(scheduleBuilder).build();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
    }

    (2)、创建QuartzJobPlanChildLocus。

    package com.troy.emergency.monitor.web.rest;
    
    import com.troy.emergency.monitor.service.PatrolPlanChildLocusService;
    import com.troy.emergency.monitor.utils.ApplicationContextProvider;
    import com.troy.emergency.monitor.utils.DateFormatUtils;
    import com.troy.emergency.monitor.utils.GetDateUtil;
    import lombok.extern.log4j.Log4j;
    import org.quartz.*;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.annotation.Resource;
    import java.util.Date;
    
    
    /**
     * @Author: CaoTing
     * @Description: 巡检人员实时轨迹
     * @Date: 2019/8/30
     */
    @Log4j
    @RestController
    public class QuartzJobPlanChildLocus implements Job {
    
    
        @Resource
        private PatrolPlanChildLocusService patrolPlanChildLocusService;
    
        @Override
        public void execute(JobExecutionContext context) throws JobExecutionException {
            try {
                //巡检人员轨迹
                this.patrolPlanChildLocusService = ApplicationContextProvider.getBean(PatrolPlanChildLocusService.class);
                patrolPlanChildLocusService.addPatrolPlanChildLocus();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static Trigger getJobPatrolPlanChildLocusTrigger(){
            try {
                //获取当天23点
                Date sTime = GetDateUtil.getTimes23();
                Date eTime= DateFormatUtils.StringToDate("2020-12-31 23:59:59","yyyy-MM-dd HH:mm:ss");
                SimpleScheduleBuilder scheduleBuilder=SimpleScheduleBuilder.simpleSchedule().withIntervalInHours(24).repeatForever();
                return TriggerBuilder.newTrigger().withIdentity("flowPersonJob","group2").startAt(sTime).endAt(eTime).withSchedule(scheduleBuilder).build();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
    
    }

    3、创建ApplicationContextProvider。

    package com.troy.emergency.monitor.utils;
    
    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.stereotype.Component;
    
    /**
     * @ProjectName:
     * @Package: com.ksky.common.config
     * @ClassName: ApplicationContextProvider
     * @Description: 获取bean对象的工具类
     * @Author: YangYeZhu
     * @CreateDate: 2019/2/15
     * @Version: 1.0
     */
    
    /**
     * @Author: CaoTing
     * @Description: 
     * @Date: 2019/8/22
     */
    @Component
    public class ApplicationContextProvider implements ApplicationContextAware {
        /**
         * 上下文对象实例
         */
        private static ApplicationContext applicationContext;
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            ApplicationContextProvider.applicationContext = applicationContext;
        }
    
        /**
         * 获取applicationContext
         *
         * @return
         */
        public static ApplicationContext getApplicationContext() {
            return applicationContext;
        }
    
        /**
         * 通过name获取 Bean.
         *
         * @param name
         * @return
         */
        public static Object getBean(String name) {
            return getApplicationContext().getBean(name);
        }
    
        /**
         * 通过class获取Bean.
         *
         * @param clazz
         * @param <T>
         * @return
         */
        public static <T> T getBean(Class<T> clazz) {
            return getApplicationContext().getBean(clazz);
        }
    
        /**
         * 通过name,以及Clazz返回指定的Bean
         *
         * @param name
         * @param clazz
         * @param <T>
         * @return
         */
        public static <T> T getBean(String name, Class<T> clazz) {
            return getApplicationContext().getBean(name, clazz);
        }
    }

    4、启动项目,可以看见打印出定时器已启动字样,后根据设置时间定时往数据库添加数据,如下图:

  • 相关阅读:
    scp 跨服务器传数据
    Mongo启动失败解决方案
    centos7 NET模式配置虚拟机
    centos7虚拟机配置桥接模式
    Linux centos7 查看cpu 磁盘 内存使用情况
    centos7修改时间和时区
    fiddler培训
    docker学习笔记
    docker-ce安装官翻
    Nginx+Tomcat简单负载均衡
  • 原文地址:https://www.cnblogs.com/baiyuer666/p/11448655.html
Copyright © 2011-2022 走看看