Java定时任务-创新互联

Java定时任务
  • JDK定时器Timer使用及原理分析
    • 小顶堆
    • 时间轮算法
    • Timer
  • 定时任务线程池解析
    • Schedule
    • Leader-Follower模式
  • 定时任务框架Quartz
    • quartz demo
    • JobDataMap
    • job并发及持久化
    • 触发器
    • 调度器
    • 整合springboot

成都创新互联公司主营嵊州网站建设的网络公司,主营网站建设方案,app软件定制开发,嵊州h5微信小程序开发搭建,嵊州网站营销推广欢迎嵊州等地区企业咨询JDK定时器Timer使用及原理分析 小顶堆

完全二叉树:只有最后一层节点数不满
堆:是一颗完全二叉树,元素满足每个节点的值都大于或者小于其父节点的值
数组存储结构:
小顶堆:最上面的最小
更好的找到父节点是谁,除以2
插入元素、删除元素

缺点:插入和删除要移动比较全部的元素,需要耗费大量性能浪费
适合比较偏小量的

时间轮算法

链表或者数组实现时间轮:遍历数组,每个下标放置一个链表,链表节点放置任务,遍历到了就取出执行
round型时间轮:任务上记录一个round,遍历到了就将round减一,为0时取出执行
缺点:需要遍历所有的任务,效率较低
分层时间轮:使用多个不同时间维度的轮。天轮记录几点执行。月轮记录几号执行。月轮遍历到了。将任务取出放到天轮里面,即可实现几号几点执行。

Timer

Timer:任务启动:new()、任务添加:.schedule()
小顶堆里面添加任务、从小顶堆里获取最近的任务、获取当前时间和这个任务下一次要执行的时间,若、要把任务删除掉重新入队、预设的时间,任务真正执行时间取决于上一个任务执行完的时间
scheduleAtFixRate():
TimerTask:写业务逻辑、再启动线程池去执行
单线程:任务阻塞、任务超时

定时任务线程池解析 Schedule

ScheduledExecutorService scheduledThreadPool = Excutors.newScheduledThreadPool()
scheduleAtFixedRate

Leader-Follower模式

避免没必要的唤醒和阻塞操作,更有效,更节省资源

定时任务框架Quartz quartz demo

Job:业务逻辑
-JobBuilder、JobDataMap
execute()

JobDetail:Job的包装
JobBuilder.newJob().withIdentity().build()

Trigger:触发器
-TriggerBuilder 、JobDataMap、ScheduleBuilder simple、
.startNow()
.withSchedule()

Scheduler:按照触发器定义的时间去执行Job
-SchedulerFactory:StdSchedulerFactory properties配置
.shcheduleJob(jobDetail,triggerr)

JobDataMap

存储一些变量

job并发及持久化

Scheduler每次执行,都会根据JobDetail创建一个新的Job实例,这样就可以规避并发访问的问题

@DisallowConcurrentExecution:禁止并发地执行同一个job定义的多个实例
前一个任务执行完了,才会执行下一个任务

@PersistJobDataAfterExecution: 将JobDataMap进行持久化

触发器

优先级:同时触发的比较优先级
错过触发:到达触发时间时没有被执行、可以配置延迟的阈值
simple:
cron:

调度器

JobStore
默认存储在内存中

整合springboot

集群处理。每个节点执行一些任务
节点间互相不通信,通过数据库来
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元起,快前往官网查看详情吧


文章标题:Java定时任务-创新互联
本文来源:http://cdiso.cn/article/hodpp.html

其他资讯