关于quartz:quartz学习quartz编码方式实现定时任务简例

[toc] 1. Job接口package com.niewj;import com.google.gson.Gson;import org.quartz.*;public class MyJob implements Job { Gson gson = new Gson(); @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { JobDetail jobDetail = jobExecutionContext.getJobDetail(); // 传数据 JobKey jobKey = jobDetail.getKey(); String description = jobDetail.getDescription(); JobDataMap jobDataMap = jobDetail.getJobDataMap(); StringBuffer buff = new StringBuffer(); buff.append("jobKey=").append(gson.toJson(jobKey)) .append("\t description=").append(description) .append("\t jobDataMap=").append(gson.toJson(jobDataMap)); System.out.println(buff); }}2. main办法package com.niewj;import lombok.extern.slf4j.Slf4j;import org.quartz.*;import org.quartz.impl.StdSchedulerFactory;@Slf4jpublic class JobTest { public static void main(String[] args) throws SchedulerException { String cron = "*/5 * * * * ?"; String identity = "1"; String group = "g1"; String desc = "JobDetail工作"; // 传给JobDetail的数据 JobDataMap map = new JobDataMap(); map.put("taskId", "1"); map.put("instanceId", "100"); // 1. 调度器 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.clear(); scheduler.start(); log.info("=================任务调度:调度器已启动==================="); // 2.定义触发器 //定义name/group Trigger trigger = TriggerBuilder.newTrigger().withIdentity(identity, group) .startNow() .withSchedule(CronScheduleBuilder.cronSchedule(cron)) .build(); // 3.定义一个工作JobDetail //定义Job类为HelloJob类,这是真正的执行逻辑所在 JobDetail jobDetail = JobBuilder.newJob(MyJob.class) //定义name/group .withIdentity(identity, group) .withDescription(desc) .usingJobData(map) .build(); // 4. 应用调度器调度JobDetail, 应用trigger触发 scheduler.scheduleJob(jobDetail, trigger); }}3. 输入15:47:10.393 [main] INFO org.quartz.impl.StdSchedulerFactory - Using default implementation for ThreadExecutor15:47:10.405 [main] INFO org.quartz.simpl.SimpleThreadPool - Job execution threads will use class loader of thread: main15:47:10.430 [main] INFO org.quartz.core.SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl15:47:10.430 [main] INFO org.quartz.core.QuartzScheduler - Quartz Scheduler v.2.3.2 created.15:47:10.431 [main] INFO org.quartz.simpl.RAMJobStore - RAMJobStore initialized.15:47:10.433 [main] INFO org.quartz.core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.3.2) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED' Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. NOT STARTED. Currently in standby mode. Number of jobs executed: 0 Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.15:47:10.433 [main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'15:47:10.433 [main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 2.3.215:47:10.434 [main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.15:47:10.434 [main] INFO com.niewj.JobTest - =================任务调度:调度器已启动===================15:47:10.434 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.core.QuartzSchedulerThread - batch acquisition of 0 triggers15:47:10.489 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers15:47:10.493 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.simpl.PropertySettingJobFactory - Producing instance of Job 'g1.1', class=com.niewj.MyJob15:47:10.569 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers15:47:10.569 [DefaultQuartzScheduler_Worker-1] DEBUG org.quartz.core.JobRunShell - Calling execute on job g1.1jobKey={"name":"1","group":"g1"} description=JobDetail工作 jobDataMap={"taskId":"1","instanceId":"100"}15:47:15.009 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.simpl.PropertySettingJobFactory - Producing instance of Job 'g1.1', class=com.niewj.MyJob15:47:15.010 [DefaultQuartzScheduler_Worker-2] DEBUG org.quartz.core.JobRunShell - Calling execute on job g1.115:47:15.010 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggersjobKey={"name":"1","group":"g1"} description=JobDetail工作 jobDataMap={"taskId":"1","instanceId":"100"}15:47:20.013 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.simpl.PropertySettingJobFactory - Producing instance of Job 'g1.1', class=com.niewj.MyJob15:47:20.013 [DefaultQuartzScheduler_Worker-3] DEBUG org.quartz.core.JobRunShell - Calling execute on job g1.115:47:20.014 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggersjobKey={"name":"1","group":"g1"} description=JobDetail工作 jobDataMap={"taskId":"1","instanceId":"100"}{"taskId":"1","instanceId":"100"}5秒钟输入一次 ...

December 29, 2022 · 2 min · jiezi

关于quartz:Quartz高可用定时任务快速上手

定时工作使用指南如果你想做定时工作,有高可用方面的需要,或者仅仅想入门快,上手简略,那么选用它准没错。 定时工作模块是对Quartz框架进一步封装,应用更加简洁。 1、引入依赖<dependency> <groupId>xin.altitude.cms</groupId> <artifactId>ucode-cms-quartz</artifactId> <version>1.5.4.1</version></dependency>2、疾速上手实现org.quartz.Job接口;应用注解CronExp增加工作的调度策略;应用注解Component将工作注入容器中。 启动我的项目,定时工作便处于监听与运行中。 @Component@DisallowConcurrentExecution@CronExp(cron = "0/5 * * * * ?")public class DemoJob implements Job { @Override public void execute(JobExecutionContext context) { System.out.println("工作1:" + LocalDateTime.now()); }}3、手动触发定时工作定时工作除了以既有频率周期性运行外,还有通过接口手动被触发的能力。 调用如下接口,可手动触发工作ID编号为jobId的工作。 http://localhost:8080/cms-api/quartz/job/{jobId}如果有手动触发定时工作的需要,则须要工作ID惟一并且已知,因而须要在编写定时工作时手动指定。 @CronExp(id = 1, cron = "0/5 * * * * ?")通过注解CronExp的id属性可指定工作ID,不显示指定则应用随机ID,不满足已知的条件,因而无奈手动触发。 4、带参数工作只管大多数工作不须要注入参数,但仍有大量的场景须要向定时工作注入参数。 public void execute(JobExecutionContext context) { /* 如果在调用工作时传入了参数,则可能从Map中获取 */ Map<String, Object> dataMap = context.getMergedJobDataMap(); /* 比方从Map中获取一个键值对,一般来说参数均为根本数据类型 */ Object key = dataMap.get("key"); System.out.println("工作2:" + LocalDateTime.now() + ": " + key);}在编写定时工作时,可从JobExecutionContext对象中解析一个Map,从而实现参数的注入。 ...

April 1, 2022 · 1 min · jiezi

关于quartz:SpringBoot-如何配置-quartz-为分布式定时任务

SpringBoot 如何配置 quartz 为分布式定时工作首发于 Dale’s blog 背景我的项目须要一个分布式的定时工作,预研之后抉择应用 quartz。quartz 的分布式须要依赖关系型数据库反对存储一些工作信息。建表sql存在于 quartz 我的项目中,github 可见库中提供了多种数据库的执行sql,我的我的项目采纳的 postgres 作为长久化数据库。 配置 quartzQuartzJobFactory /** * quartz job factory * * @author Dale */@Componentpublic class QuartzJobFactory extends AdaptableJobFactory { @Autowired private AutowireCapableBeanFactory autowireCapableBeanFactory; @Override protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { Object jobInstance = super.createJobInstance(bundle); autowireCapableBeanFactory.autowireBean(jobInstance); return jobInstance; }}QuartzConf /** * 配置分布式 quartz * * @author Dale */@Configurationpublic class QuartzConf { private QuartzJobFactory quartzJobFactory; @Resource(name = "master") private DataSourceProperties masterProperties; @Autowired public void setQuartzJobFactory(QuartzJobFactory quartzJobFactory) { this.quartzJobFactory = quartzJobFactory; } @Bean public SchedulerFactoryBean schedulerFactoryBean() throws IOException { PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean(); // 设置 quartz 的配置文件是 classpath 下的 quartz.properties 文件 propertiesFactoryBean.setLocation(new ClassPathResource("quartz.properties")); propertiesFactoryBean.afterPropertiesSet(); SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); schedulerFactoryBean.setQuartzProperties(Objects.requireNonNull(propertiesFactoryBean.getObject())); schedulerFactoryBean.setJobFactory(quartzJobFactory); schedulerFactoryBean.setApplicationContextSchedulerContextKey("applicationContextKey"); schedulerFactoryBean.setWaitForJobsToCompleteOnShutdown(true); schedulerFactoryBean.setOverwriteExistingJobs(false); schedulerFactoryBean.setStartupDelay(10); // 设置 quartz 的DataSource 为主库的配置 schedulerFactoryBean.setDataSource(masterProperties.initializeDataSourceBuilder().type(DruidDataSource.class).build()); return schedulerFactoryBean; } @Bean(name = "scheduler") public Scheduler scheduler() throws IOException { return schedulerFactoryBean().getScheduler(); }}留神:因为我的项目先前配置了数据库的主从拆散,所以专用数据库链接,防止额定再有一处数据库连贯配置。quartz.properties ...

October 19, 2021 · 1 min · jiezi

关于quartz:在线QuartzCron定时任务表达式在线生成

在线QuartzCron定时工作表达式在线生成在线QuartzCron定时工作表达式在线生成 Quartz是一个齐全由java编写的开源作业调度框架,Quartz最次要的性能就是调度器(实现定时工作)。本工具能够在线生成QuartzCron表达式 https://tooltt.com/quartzcron/

July 25, 2021 · 1 min · jiezi

关于quartz:项目中使用quartz定时任务框架记录

1.简述我的项目中需要是在开始工夫和完结工夫周期性的执行指定的工作(脚本),完结后可能更新工作状态,对应的工作比拟耗时,每个工作可能执行的工夫是10s到几分钟。根据需要进行设计,周期性的工作有定时工作框架quartz实现,定时工作每次执行将工作信息扔到音讯队列中,音讯队列消费者多线程生产音讯,工作执行实现后确认生产了音讯,并更新工作后果状态2.quartz 调度器A.注册Scheduler配置文件```javaorg.quartz.scheduler.instanceName = PeriodCheckQuartzSchedulerorg.quartz.scheduler.rmi.export = falseorg.quartz.scheduler.rmi.proxy = falseorg.quartz.scheduler.wrapJobExecutionInUserTransaction = falseorg.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPoolorg.quartz.threadPool.threadCount = 5org.quartz.threadPool.threadPriority = 5org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = trueorg.quartz.jobStore.misfireThreshold = 5000org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTXorg.quartz.jobStore.tablePrefix = QRTZ_org.quartz.jobStore.dataSource = qzDSorg.quartz.dataSource.qzDS.driver = com.mysql.jdbc.Driverorg.quartz.dataSource.qzDS.URL = jdbc:mysql://10.50.0.152:3306/cmp?characterEncoding=utf8org.quartz.dataSource.qzDS.user = rootorg.quartz.dataSource.qzDS.password = 123456```B.注册bean ```java @Configurationpublic class SchedulerConfig { @Autowired private SpringJobFactory springJobFactory; @Autowired private QuarzProperties quarzProperties; @Bean(name = "SchedulerFactory") public SchedulerFactoryBean schedulerFactoryBean() throws IOException { SchedulerFactoryBean factory = new SchedulerFactoryBean(); factory.setAutoStartup(true); factory.setStartupDelay(5);//延时5秒启动 factory.setQuartzProperties(quartzProperties()); factory.setJobFactory(springJobFactory); return factory; } @Bean public Properties quartzProperties() throws IOException { PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean(); propertiesFactoryBean.setProperties(quarzProperties.getQuartzProperties()); propertiesFactoryBean.afterPropertiesSet(); return propertiesFactoryBean.getObject(); } @Bean(name="Scheduler") public Scheduler scheduler() throws IOException { return schedulerFactoryBean().getScheduler(); }} ```3.自定义Job工作 import org.quartz.DisallowConcurrentExecution; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import java.io.Serializable; @DisallowConcurrentExecution public class PeriodCheckJob implements Job, Serializable { private static final long serialVersionUID = 1L; private static final Logger logger = LoggerFactory.getLogger(PeriodCheckJob.class); @Autowired private PeriodCheckService periodCheckService; @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { //业务逻辑 } }4.JobDetail和TriggerClass dj = Class.forName(PeriodCheckJob.class.getName());dj.newInstance();JobDetail jobDetail = JobBuilder.newJob(dj).withIdentity(new JobKey(PeriodCheckJob.class.toString() + expression + checkId, JOB_GROUP)).withDescription("description").build();jobDetail.getJobDataMap().put("checkId", checkId);CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(expression).withMisfireHandlingInstructionDoNothing();//开始工夫和完结工夫,以及通过cron表达式定义执行工夫Trigger trigger = trigger = TriggerBuilder.newTrigger().withIdentity(new TriggerKey(PeriodCheck.class.toString() + expression + checkId, "TRIGGER_KEY_" + expression)) .startAt(startTime).endAt(endTime).withSchedule(cronScheduleBuilder).build();scheduler.scheduleJob(jobDetail, trigger);5.工作状态A.敞开工作JobKey jobKey = new JobKey(PeriodCheckJob.class.toString() + expression + checkId, JOB_GROUP); scheduler.pauseJob(jobKey);//暂停工作scheduler.deleteJob(jobKey);//敞开工作scheduler.resumeJob(jobKey);//重启工作//批改工作工作配置信息TriggerKey triggerKey = new TriggerKey(InspectPlan.class.toString(), planId.toString());CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(inspectPlan.getCronExpression());CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();scheduler.rescheduleJob(triggerKey, trigger);//从新调度工作###6.工作完结事件监听 ...

March 11, 2021 · 2 min · jiezi

关于quartz:quartz简单用法用cron表达式

1.实现Job接口 --你要做什么事? public class myJob implements Job { @Autowired private PileStateManager pileStateManager; @Override public void execute(JobExecutionContext arg0) throws JobExecutionException { //判断以后工夫发送指定费率报文 int hours = new Date().getHours(); if (hours >= 7 && hours < 11) { System.out.println("我是尖"); // buf.writeBytes(ByteConvertUtil.hourChargeTo2Bytes((int) cachePile.getOneRate())); } else if (hours >= 19 && hours < 23) { System.out.println("我是峰"); // buf.writeBytes(ByteConvertUtil.hourChargeTo2Bytes((int) cachePile.getTwoRate())); } else if (hours >= 11 && hours < 19) { System.out.println("我是平"); pileStateManager.UpdateChargeRate(); //buf.writeBytes(ByteConvertUtil.hourChargeTo2Bytes((int) cachePile.getThreeRate())); } else { System.out.println("我是谷"); // buf.writeBytes(ByteConvertUtil.hourChargeTo2Bytes((int) cachePile.getFourRate())); } }2.Tirgger -触发器 --你什么时候去做3.Scheduler -任务调度器 --你什么时候须要去做什么事 ...

January 7, 2021 · 1 min · jiezi

关于quartz:Quartz使用大全

http://www.quartz-scheduler.o... 1.应用QuartzQuartz Scheduler一旦敞开,无奈重启 须要从新实例化提供了暂停状态SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();Scheduler sched = schedFact.getScheduler();sched.start();// define the job and tie it to our HelloJob classJobDetail job = newJob(HelloJob.class) .withIdentity("myJob", "group1") .build();// Trigger the job to run now, and then every 40 secondsTrigger trigger = newTrigger() .withIdentity("myTrigger", "group1") .startNow() .withSchedule(simpleSchedule() .withIntervalInSeconds(40) .repeatForever()) .build();// Tell quartz to schedule the job using our triggersched.scheduleJob(job, trigger);2.Quartz API,JOB和Triggerhttp://www.quartz-scheduler.o... JobBuilder-用于定义/构建JobDetail实例,该实例定义Jobs实例。JobDetail-用于定义Job的实例。Job-由您心愿由调度程序执行的组件实现的接口。TriggerBuilder-用于定义/构建触发器实例。Trigger-定义将在其上执行给定作业的时间表的组件。Scheduler一个Scheduler的生命周期是由它的创作范畴,通过SchedulerFactory来调用他的创立和敞开。 创立Scheduler后,就能够应用它 增加删除列出Job和Trigger 以及执行其余与打算相干的操作(例如暂停触发器)。然而,调度程序在应用starter之前实际上不会对任何trigger执行工作起作用 Builder的演示 // define the job and tie it to our HelloJob class JobDetail job = newJob(HelloJob.class) .withIdentity("myJob", "group1") // name "myJob", group "group1" .build(); // Trigger the job to run now, and then every 40 seconds Trigger trigger = newTrigger() .withIdentity("myTrigger", "group1") .startNow() .withSchedule(simpleSchedule() .withIntervalInSeconds(40) .repeatForever()) .build(); // Tell quartz to schedule the job using our trigger sched.scheduleJob(job, trigger);Jobs and TriggersJob是一个接口 ...

December 7, 2020 · 6 min · jiezi

关于quartz:Quartz框架实现定时业务

超时订单阐明:电商我的项目中,如果订单提交之后如果30分钟没有实现付款,则将订单状态由1(待付款)改为6(交易失败).示意订单交易敞开.问题:如何实现每个订单30分钟超时? 思路1: 利用数据库的计时的函数每当order入库之后,能够增加一个函数30分钟之后批改状态.该办法不敌对, 100万的订单刚刚入库. 100万个监听的事件.会使数据库因为监听而解体. 思路2: 利用音讯队列的形式实现 redis 开启线程向redis中存储数据之后设定超时工夫.当key一旦生效则批改数据库状态.Redis次要做缓存应用. 然而不适合. 思路3:开启独自的一个线程(异步),每隔1分钟查问一次数据库,批改超时的订单解决即可. Quartz框架介绍java原生的timer也能够实现开启独自线程实现定时工作,然而有一些缺点,当初这个Quartz是比拟罕用的模式. Quartz是OpenSymphony开源组织在Job scheduling畛域又一个开源我的项目,它能够与J2EE与J2SE应用程序相结合也能够独自应用。Quartz能够用来创立简略或为运行十个,百个,甚至是好几万个Jobs这样简单的程序。Jobs能够做成规范的Java组件或 EJBs。Quartz的最新版本为Quartz 2.3.2。 组件阐明: Job 是用户自定义的工作.JobDetail 负责封装工作的工具API.如果工作须要被执行,则必须通过jobDetail封装.Schedular调度器: 负责工夫监控,当工作的执行工夫一到则交给触发器解决Trigger触发器: 当接管到调度器的命令则开启新的线程执行job…Quartz实现导入jar包<!--增加Quartz的反对 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId></dependency>编辑配置类@Configurationpublic class OrderQuartzConfig { /** * 思维阐明: * 如果须要执行定时工作须要思考的问题 * 1.工作多久执行一次. 1分钟执行一次 * 2.定时工作应该执行什么 */ //定义工作详情 @Bean public JobDetail orderjobDetail() { //指定job的名称和长久化保留工作 return JobBuilder .newJob(OrderQuartz.class) //1.定义执行的工作 .withIdentity("orderQuartz") //2.工作指定名称 .storeDurably() .build(); } //定义触发器 @Bean public Trigger orderTrigger() { /*SimpleScheduleBuilder builder = SimpleScheduleBuilder.simpleSchedule() .withIntervalInMinutes(1) //定义工夫周期 .repeatForever();*/ CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0 0/1 * * * ?"); return TriggerBuilder .newTrigger() .forJob(orderjobDetail()) //执行的工作 .withIdentity("orderQuartz") //工作的名称 .withSchedule(scheduleBuilder).build(); }} 编辑定时工作//筹备订单定时工作@Componentpublic class OrderQuartz extends QuartzJobBean{ @Autowired private OrderMapper orderMapper; /** * 如果用户30分钟之内没有实现领取,则将订单的状态status由1改为6. * 条件判断的根据: now()-创立工夫 > 30分钟 <==> created < now()-30 * * sql: update tb_order set status=6,updated=#{updated} where status=1 and created< #{timeOut} * @param context * @throws JobExecutionException */ @Override @Transactional protected void executeInternal(JobExecutionContext context) throws JobExecutionException { //1.利用java工具API实现计算 Calendar calendar = Calendar.getInstance(); //获取以后的工夫 calendar.add(Calendar.MINUTE,-30); Date timeOut = calendar.getTime(); //获取超时工夫 Order order = new Order(); order.setStatus(6); //order.setUpdated(new Date()); UpdateWrapper<Order> updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("status", "1").lt("created",timeOut); orderMapper.update(order, updateWrapper); System.out.println("定时工作执行"); }}

September 21, 2020 · 1 min · jiezi