当前位置: 首页 > 后端技术 > Java

Javaweb应用结合Quartz实现定时任务

时间:2023-04-01 16:33:29 Java

背景负责人:业务部想统计我们公司调用人脸识别在线验证服务的次数。您有责任定期发布报表,以方便结算业务人员费用。coder:好的,我想着每个月1号凌晨通过定时任务汇总上个月的数据,生成一个excel,这样我们前端妹子的整个页面就可以下载业务了.知识储备关于定时任务,我首先想到的是Quartz,它是一个完全用Java编写的开源作业调度框架。下面介绍几个核心概念:Job表示一个作业,具体要执行的内容。该接口只有一个方法,如下:voidexecute(JobExecutionContextjobExecutionContext)JobDetail代表一个具体的可执行调度器,Job是可执行调度器要执行的内容。trigger表示配置一个调度参数,什么时候调整。其中CronTrigger比SimpleTrigger更常用,它不像SimpleTrigger那样精确指定时间间隔,而是基于日历作业调度。Scheduler代表一个调度容器,一个调度容器中可以注册多个JobDetails和Triggers。当Trigger与JobDetail结合时,可以通过Scheduler容器进行调度。为了在应用启动时自动加载定时任务,我采用了实现ServletContextListener接口的方法。ServletContextListener随Web应用程序的启动而启动,仅初始化一次,并在Web应用程序停止时销毁。主要使用场景:做一些初始化工作,设置一些基本内容(比如公共参数或者一些固定对象等)。实际操作是将相关的jar包导入到web应用中。在web.xml中定义监听器。com.lee.demo01.MyScheduleListener创建MyJob并实现Job。这里我会打印日期,其实可以改成汇总数据生成excel的动作。公共类MyJob实现Job{@Overridepublicvoidexecute(JobExecutionContextjobExecutionContext)throwsJobExecutionException{System.out.println("MyJobstartsat"+newSimpleDateFormat("yyyy-MM-ddHH:mm:ss").format(new日期()));}}定义定时任务的开始和定时任务的停止。我这里的Cron表达式定义为:“0/1?”,即每秒触发一次。Cron表达式的使用请参考官方文档。publicclassMyQuartz{privatestaticSc??heduler调度程序;/*启动定时任务*/publicstaticvoidrun()throwsException{System.out.println("定时任务启动");JobDetailjobDetail=JobBuilder.newJob((Class)MyJob.class).withIdentity("job1","group1").build();CronTriggercronTrigger=(CronTrigger)TriggerBuilder.newTrigger().withIdentity("trigger1","group1").withSchedule(CronScheduleBuilder.cronSchedule("0/1****?")).build();SchedulerFactoryschedulerFactory=newStdSchedulerFactory();scheduler=schedulerFactory.getScheduler();scheduler.scheduleJob(jobDetail,cronTrigger);调度器.start();}/*停止计划任务*/publicstaticvoidstop()throwsException{System.out.println("计划任务停止");调度程序.shutdown();}}创建MyScheduleListener并实现ServletContextListener。publicclassMyScheduleListenerimplementsServletContextListener{@OverridepublicvoidcontextInitialized(ServletContextEventarg0){System.out.println("定时任务开始");尝试{MyQuartz.run();}catch(Exceptione){e.printStackTrace();}}@OverridepublicvoidcontextDestroyed(ServletContextEventarg0){System.out.println("定时任务停止");尝试{MyQuartz.stop();}catch(Exceptione){e.printStackTrace();}}}Start在web应用中,控制台可以看到定时任务启动和每秒打印的日志。定时任务启动定时任务启动log4j:WARNNoappenderscouldbefoundforlogger(org.quartz.impl.StdSchedulerFactory).log4j:WARNPleaseinitializethelog4jsystemproperly.log4j:WARNSeehttp://logging.apache.org/log4j/1.2/faq.html#noconfig了解更多信息。[2022-04-1904:50:02,072]ArtifactMyWeb:warexploded:Artifact部署成功[2022-04-1904:50:02,072]ArtifactMyWeb:战争爆发:部署耗时447毫秒MyJob开始于2022-04-1916:50:02MyJob开始于2022-04-1916:50:0316:50:05MyJob开始于2022-04-1916:50:06MyJob开始at2022-04-1950:09MyJobstartsat2022-04-1916:50:10补充说明我在上面的一个类里写了定时任务的调度。为了方便Cron表达式的配置,也可以在配置文件中设置。在web.xml中添加QuartzInitializerServlet。仍然需要导入相关的jar包,在web应用中创建MyJob。QuartzInitializerorg.quartz.ee.servlet.QuartzInitializerServletshutdown-on-unloadtrueconfig-file石英。properties1创建配置文件quartz.properties。org.quartz.scheduler.instanceName=AUTOorg.quartz.scheduler.instanceId=AUTOorg.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPoolorg.quartz.threadPool.threadCount=5org.quartz.threadPool.threadPriority=5org.quartz。plugin.triggHistory.class=org.quartz.plugins.history.LoggingJobHistoryPluginorg.quartz.plugin.jobInitializer.class=org.quartz.plugins.xml.XMLSchedulingDataProcessorPluginorg.quartz.plugin.jobInitializer.fileNames=quartz_jobs.xmlorg.quartz.plugin.jobInitializer.failOnFileNotFound=trueorg.quartz.plugin.jobInitializer.scanInterval=10org.quartz.plugin.jobInitializer.wrapInUserTransaction=false创建配置文件quartz_jobs.xml。job1group1定时任务com.lee.demo01.MyJobtrigger1group1job1group10/1****?