2023年7月21日发(作者:)
Springbootquartz注解集群分布式定时任务1.数据库表相关/* 删除数据的时候,部分表存在外键,⽆法⽤truncate table 命令,需要先删除主表的数据,才能删除外键表的数据
TRUNCATE TABLE qrtz_fired_triggers;TRUNCATE TABLE qrtz_paused_trigger_grps;TRUNCATE TABLE qrtz_scheduler_state;TRUNCATE TABLE qrtz_locks;TRUNCATE TABLE qrtz_simple_triggers;TRUNCATE TABLE qrtz_simprop_triggers;TRUNCATE TABLE qrtz_cron_triggers;TRUNCATE TABLE qrtz_blob_triggers;TRUNCATE TABLE qrtz_calendars;DELETE FROM qrtz_triggers;DELETE FROM qrtz_job_details;*/DROP TABLE IF EXISTS qrtz_fired_triggers;DROP TABLE IF EXISTS qrtz_paused_trigger_grps;DROP TABLE IF EXISTS qrtz_scheduler_state;DROP TABLE IF EXISTS qrtz_locks;DROP TABLE IF EXISTS qrtz_simple_triggers;DROP TABLE IF EXISTS qrtz_simprop_triggers;DROP TABLE IF EXISTS qrtz_cron_triggers;DROP TABLE IF EXISTS qrtz_blob_triggers;DROP TABLE IF EXISTS qrtz_triggers;DROP TABLE IF EXISTS qrtz_job_details;DROP TABLE IF EXISTS qrtz_calendars;CREATE TABLE qrtz_job_details( SCHED_NAME VARCHAR(120) NOT NULL, JOB_NAME VARCHAR(200) NOT NULL, JOB_GROUP VARCHAR(200) NOT NULL, DESCRIPTION VARCHAR(250) NULL, JOB_CLASS_NAME VARCHAR(250) NOT NULL, IS_DURABLE VARCHAR(1) NOT NULL, IS_NONCONCURRENT VARCHAR(1) NOT NULL, IS_UPDATE_DATA VARCHAR(1) NOT NULL, REQUESTS_RECOVERY VARCHAR(1) NOT NULL, JOB_DATA BLOB NULL, PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;#--存储已配置的 Trigger 的信息CREATE TABLE qrtz_triggers ( SCHED_NAME VARCHAR(120) NOT NULL, TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, JOB_NAME VARCHAR(200) NOT NULL, JOB_GROUP VARCHAR(200) NOT NULL, DESCRIPTION VARCHAR(250) NULL, NEXT_FIRE_TIME BIGINT(13) NULL, PREV_FIRE_TIME BIGINT(13) NULL, PRIORITY INTEGER NULL, TRIGGER_STATE VARCHAR(16) NOT NULL, TRIGGER_TYPE VARCHAR(8) NOT NULL, START_TIME BIGINT(13) NOT NULL, END_TIME BIGINT(13) NULL, END_TIME BIGINT(13) NULL, CALENDAR_NAME VARCHAR(200) NULL, MISFIRE_INSTR SMALLINT(2) NULL, JOB_DATA BLOB NULL, PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP) REFERENCES qrtz_job_details(SCHED_NAME,JOB_NAME,JOB_GROUP)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;#-- 存储简单的 Trigger,包括重复次数,间隔,以及已触的次数CREATE TABLE qrtz_simple_triggers ( SCHED_NAME VARCHAR(120) NOT NULL, TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, REPEAT_COUNT BIGINT(7) NOT NULL, REPEAT_INTERVAL BIGINT(12) NOT NULL, TIMES_TRIGGERED BIGINT(10) NOT NULL, PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) REFERENCES qrtz_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;#-- 存储 Cron Trigger,包括 Cron 表达式和时区信息CREATE TABLE qrtz_cron_triggers ( SCHED_NAME VARCHAR(120) NOT NULL, TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, CRON_EXPRESSION VARCHAR(120) NOT NULL, TIME_ZONE_ID VARCHAR(80), PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) REFERENCES qrtz_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;#-- 存储简单的 Trigger,包括重复次数,间隔,以及已触的次数CREATE TABLE qrtz_simprop_triggers ( SCHED_NAME VARCHAR(120) NOT NULL, TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, STR_PROP_1 VARCHAR(512) NULL, STR_PROP_2 VARCHAR(512) NULL, STR_PROP_3 VARCHAR(512) NULL, INT_PROP_1 INT NULL, INT_PROP_2 INT NULL, LONG_PROP_1 BIGINT NULL, LONG_PROP_2 BIGINT NULL, DEC_PROP_1 NUMERIC(13,4) NULL, DEC_PROP_2 NUMERIC(13,4) NULL, BOOL_PROP_1 VARCHAR(1) NULL, BOOL_PROP_2 VARCHAR(1) NULL, PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) REFERENCES qrtz_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;#-- Trigger 作为 Blob 类型存储#-- (⽤于 Quartz ⽤户⽤ JDBC 创建他们⾃⼰定制的 Trigger 类型,JobStore并不知道如何存储实例的时候)CREATE TABLE qrtz_blob_triggers ( SCHED_NAME VARCHAR(120) NOT NULL, TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, BLOB_DATA BLOB NULL, PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP), FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) REFERENCES qrtz_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;#-- 以 Blob 类型存储 Quartz 的 Calendar 信息CREATE TABLE qrtz_calendars ( SCHED_NAME VARCHAR(120) NOT NULL, CALENDAR_NAME VARCHAR(200) NOT NULL, CALENDAR BLOB NOT NULL, PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;#-- 存储已暂停的 Trigger 组的信息CREATE TABLE qrtz_paused_trigger_grps ( SCHED_NAME VARCHAR(120) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;#-- 存储与已触发的 Trigger 相关的状态信息,以及相联 Job 的执⾏信息CREATE TABLE qrtz_fired_triggers ( SCHED_NAME VARCHAR(120) NOT NULL, ENTRY_ID VARCHAR(95) NOT NULL, TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, INSTANCE_NAME VARCHAR(200) NOT NULL, FIRED_TIME BIGINT(13) NOT NULL, SCHED_TIME BIGINT(13) NOT NULL, PRIORITY INTEGER NOT NULL, STATE VARCHAR(16) NOT NULL, JOB_NAME VARCHAR(200) NULL, JOB_GROUP VARCHAR(200) NULL, IS_NONCONCURRENT VARCHAR(1) NULL, REQUESTS_RECOVERY VARCHAR(1) NULL, PRIMARY KEY (SCHED_NAME,ENTRY_ID)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;#-- 存储少量的有关 Scheduler 的状态信息,和别的 Scheduler 实例(假如是⽤于⼀个集群中)CREATE TABLE qrtz_scheduler_state ( SCHED_NAME VARCHAR(120) NOT NULL, INSTANCE_NAME VARCHAR(200) NOT NULL, LAST_CHECKIN_TIME BIGINT(13) NOT NULL, CHECKIN_INTERVAL BIGINT(13) NOT NULL, PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;#-- 存储程序的悲观锁的信息(假如使⽤了悲观锁)CREATE TABLE qrtz_locks ( SCHED_NAME VARCHAR(120) NOT NULL, LOCK_NAME VARCHAR(40) NOT NULL, PRIMARY KEY (SCHED_NAME,LOCK_NAME)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY ON qrtz_job_details(SCHED_NAME,REQUESTS_RECOVERY);CREATE INDEX IDX_QRTZ_J_GRP ON qrtz_job_details(SCHED_NAME,JOB_GROUP);CREATE INDEX IDX_QRTZ_T_J ON qrtz_triggers(SCHED_NAME,JOB_NAME,JOB_GROUP);CREATE INDEX IDX_QRTZ_T_JG ON qrtz_triggers(SCHED_NAME,JOB_GROUP);CREATE INDEX IDX_QRTZ_T_JG ON qrtz_triggers(SCHED_NAME,JOB_GROUP);CREATE INDEX IDX_QRTZ_T_C ON qrtz_triggers(SCHED_NAME,CALENDAR_NAME);CREATE INDEX IDX_QRTZ_T_G ON qrtz_triggers(SCHED_NAME,TRIGGER_GROUP);CREATE INDEX IDX_QRTZ_T_STATE ON qrtz_triggers(SCHED_NAME,TRIGGER_STATE);CREATE INDEX IDX_QRTZ_T_N_STATE ON qrtz_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE);CREATE INDEX IDX_QRTZ_T_N_G_STATE ON qrtz_triggers(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE);CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME ON qrtz_triggers(SCHED_NAME,NEXT_FIRE_TIME);CREATE INDEX IDX_QRTZ_T_NFT_ST ON qrtz_triggers(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME);CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE ON qrtz_triggers(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME);CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE ON qrtz_triggers(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE);CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP ON qrtz_triggers(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME ON qrtz_fired_triggers(SCHED_NAME,INSTANCE_NAME);CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY ON qrtz_fired_triggers(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY);CREATE INDEX IDX_QRTZ_FT_J_G ON qrtz_fired_triggers(SCHED_NAME,JOB_NAME,JOB_GROUP);CREATE INDEX IDX_QRTZ_FT_JG ON qrtz_fired_triggers(SCHED_NAME,JOB_GROUP);CREATE INDEX IDX_QRTZ_FT_T_G ON qrtz_fired_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP);CREATE INDEX IDX_QRTZ_FT_TG ON qrtz_fired_triggers(SCHED_NAME,TRIGGER_GROUP);2.配置⽂件 ties:#调度器实例名称ceName = quartzScheduler#调度器实例编号⾃动⽣成ceId = AUTO#持久化⽅式配置 = reTX#持久化⽅式配置数据驱动,MySQL数据库DelegateClass = CDelegate#quartz相关数据表前缀名refix = QRTZ_#开启分布式部署tered = true#配置是否使⽤perties = false#分布式节点有效性检查时间间隔,单位:毫秒rCheckinInterval = 20000#线程池实现类 = ThreadPool#执⾏最⼤并发线程数量Count = 10#线程优先级Priority = 5#配置为守护线程,设置后任务将不会执⾏#readsDaemons=true#配置是否启动⾃动加载数据库内的定时任务,默认sInheritContextClassLoaderOfInitializingThread = true3.代码配置(注解⽅式)package ;import tory;import rFiredBundle;import re;import reCapableBeanFactory;import ationContext;import ationContextAware;import ;import uration;import athResource;import Scheduling;import lerFactoryBean;import BeanJobFactory;import urce;@Configuration@EnableSchedulingpublic class QuartzConfiguration { private static class MySpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware { private transient AutowireCapableBeanFactory beanFactory; @Override public void setApplicationContext(ApplicationContext applicationContext) { beanFactory = owireCapableBeanFactory(); } @Override protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { final Object job = JobInstance(bundle); reBean(job); return job; } } /** * 配置任务⼯⼚实例 * @param applicationContext spring上下⽂ * @return */ @Bean public JobFactory jobFactory(ApplicationContext applicationContext) { MySpringBeanJobFactory jobFactory = new MySpringBeanJobFactory(); licationContext(applicationContext); return jobFactory; } @Bean(destroyMethod = "destroy", autowire = ) public SchedulerFactoryBean schedulerFactoryBean(JobFactory jobFactory, DataSource dataSource) { SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); Factory(jobFactory); rwriteExistingJobs(true); rtupDelay(2); oStartup(true); aSource(dataSource); licationContextSchedulerContextKey("applicationContext"); figLocation(new ClassPathResource("/ties")); return schedulerFactoryBean; }}4.定时任务代码package ler;import .*;import ;import Factory;import ent;import ce;@Componentpublic class HdfsScheduler { private static final Logger logger = ger(); private static Scheduler scheduler; @Resource private void setScheduler(Scheduler scheduler) { ler = scheduler; } public static void hdfsUsageTimerScheduler() { try { String triggerName = "trigger"; String jobName = "job"; String group = e(); TriggerKey triggerKey = rKey(triggerName, group); Trigger trigger = gger(triggerKey); if (null == trigger) { // 创建任务 JobDetail jobDetail = ().withIdentity(jobName, group).build(); CronScheduleBuilder scheduleBuilder = hedule("0 10 0 * * ?"); // 创建触发器 trigger = gger().withIdentity(triggerName, group).withSchedule(scheduleBuilder).build(); // 将触发器和任务绑定到调度器内 leJob(jobDetail, trigger); ("Quartz 创建了job: {}", ()); } else { ("job: {} 已存在", ()); } } catch (Exception e) { ("quartz(hdfsUsageTimerScheduler)异常:" + sage(), e); } }}5.具体的job任务package ler;import Utils;import cutionContext;import cutionException;import ;import Factory;import ;import JobBean;import ce;import .*;import DateFormat;import .*;public class HdfsUsageTimer extends QuartzJobBean { private static Logger logger = ger(); @Override protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { long startTime = tTimeMillis(); ("quartz(hdfsUsageTimerScheduler) startTime: " + LongToStr(startTime));
long endTime = tTimeMillis(); ("quartz(hdfsUsageTimerScheduler) endTime: " + LongToStr(startTime) + ", costTime: " + (endTime - startTime) + "ms"); }}
发布者:admin,转转请注明出处:http://www.yc00.com/news/1689930538a295241.html
评论列表(0条)