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、启动项目,可以看见打印出定时器已启动字样,后根据设置时间定时往数据库添加数据,如下图:

猜你喜欢

转载自www.cnblogs.com/baiyuer666/p/11448655.html