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