完全二叉树:只有最后一层节点数不满
堆:是一颗完全二叉树,元素满足每个节点的值都大于或者小于其父节点的值
数组存储结构:
小顶堆:最上面的最小
更好的找到父节点是谁,除以2
插入元素、删除元素
缺点:插入和删除要移动比较全部的元素,需要耗费大量性能浪费
适合比较偏小量的
链表或者数组实现时间轮:遍历数组,每个下标放置一个链表,链表节点放置任务,遍历到了就取出执行
round型时间轮:任务上记录一个round,遍历到了就将round减一,为0时取出执行
缺点:需要遍历所有的任务,效率较低
分层时间轮:使用多个不同时间维度的轮。天轮记录几点执行。月轮记录几号执行。月轮遍历到了。将任务取出放到天轮里面,即可实现几号几点执行。
Timer:任务启动:new()、任务添加:.schedule()
小顶堆里面添加任务、从小顶堆里获取最近的任务、获取当前时间和这个任务下一次要执行的时间,若、要把任务删除掉重新入队、预设的时间,任务真正执行时间取决于上一个任务执行完的时间
scheduleAtFixRate():
TimerTask:写业务逻辑、再启动线程池去执行
单线程:任务阻塞、任务超时
ScheduledExecutorService scheduledThreadPool = Excutors.newScheduledThreadPool()
scheduleAtFixedRate
避免没必要的唤醒和阻塞操作,更有效,更节省资源
定时任务框架Quartz quartz demoJob:业务逻辑
-JobBuilder、JobDataMap
execute()
JobDetail:Job的包装
JobBuilder.newJob().withIdentity().build()
Trigger:触发器
-TriggerBuilder 、JobDataMap、ScheduleBuilder simple、
.startNow()
.withSchedule()
Scheduler:按照触发器定义的时间去执行Job
-SchedulerFactory:StdSchedulerFactory properties配置
.shcheduleJob(jobDetail,triggerr)
存储一些变量
job并发及持久化Scheduler每次执行,都会根据JobDetail创建一个新的Job实例,这样就可以规避并发访问的问题
@DisallowConcurrentExecution:禁止并发地执行同一个job定义的多个实例
前一个任务执行完了,才会执行下一个任务
@PersistJobDataAfterExecution: 将JobDataMap进行持久化
触发器优先级:同时触发的比较优先级
错过触发:到达触发时间时没有被执行、可以配置延迟的阈值
simple:
cron:
JobStore
默认存储在内存中
集群处理。每个节点执行一些任务
节点间互相不通信,通过数据库来
quartz.properties
QRTZ
配置文件、建表语句
QuartzJobBean
executeInternal(JobExecutionContext context)
SchedulerConfig
Scheduler按照配置文件创建调度器
@Bean
Scheduler scheduler()
@Bean
SchedulerFactoryBean
factory.setSchedulerName(“”)
factory.setDataSource()
factory.setApplicationContextSchedulerContextKey(“applicaiton”)
factory.setQuartzProperties(quartzProperties())
factory.setTaskExecutor(schedulerThreadPool())
factory.setStarter
@Bean
DataSource
@Bean
Executor schedulerThreadPool{
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor
executor.setCorePoolSize
executor.setMaxPoolSize
executor.setQueue
@Bean
Properties quartzProperties()
PropertiesFactoryBean propertiesFactoryBean
propertiesFactoryBean.setLocation(new ClassPathResource(“quartz.properties”))
propertiesFactoryBean.afterpeopertiesSet()
return propertiesFactoryBean.getObject
通过监听器启动调度
StarterApplocationListener implements ApplicationListener()
@Autowired
Scheduler
IOC容器启动起来以后启动调度
onApplicationEvent(ContextRefreshedEvent event){
TriggerKey triggerKey=TriggerKey.triggerKey()
scheduler.getTrigger(triggerKey);
if(trigger == null) {
trigger=TriggerBuilder.newTrigger()
.withIdentity(triggerKey)
.withSchedule(CronScheduleBuiler.cronSchedule(“0/10 * * * * ?”))
.build();
JobDetail jobDetail = JobBuilder.newJob(QuartzJob.class)
.withIdentity()
.build()
scheduler.scheduleJob(jobDetail,trigger);
sheduler.start();
}
@SpringBootApplication
数据库里存储了一些历史数据
一个JobDetail在一个节点
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧