新闻详情

新闻详情

首页 / 资讯中心 / 详情

java定时任务-----启动即开始

发布时间:2026/9/1 20:49:45来源:尧图网络
java定时任务-----启动即开始
在java项目中常常用到定时任务如果在项目一开始的情况下就需要将定时任务启动这个需要怎么做呢今天就让我来写一个小demo吧。凑合看吧import io.jsonwebtoken.lang.Collections; import org.quartz.*; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.List; Componet public class JobInitializer{ Resource private Scheduler scheduler; //自己的业务mapper Resource prtivate BusinessScheduledMapper businessScheduledMapper; //ScheduledDto也是自己项目中的 Resource prtivate ScheduledLockMapper ScheduledLockMapper ; PostConstruct public void initJobs() throws ClassNotFoundException,SchedulerException{ //在数据库中配置了所有的定时任务cros ListScheduledDto list businessScheduledMapper.findAll(); if(Collections.isEmpty(list)){ return ; } for(ScheduledDto s : list){ Class? extends Job jobClazz (Class? extends Job ) Class.forName(s.getJobClass()); JobDetail jobDetail JobBuilder.newJob(jobClazz).withIdentity(s.getJobName()).storeDurably().build(); CronTrigger cronTrigger TriggerBuilder.newTrigger() .withIdentity(s.getTriggerName()) .startNow() .withSchedule(CronScheduleBuilder.cronSchedule(s.getCron()))\ .build(); scheduler.scheduileJob(jobDetail,cronTrigger); } if(!schedule.isShutdown()){ scheduler.start(); } } }import org.quartz.DisallowConcurrentExecution; import org.quartz.Job; import org.quartz.JobExecutionException; import org.quartz.JobExecutionContext; import org.springframework.stereotype.Component; import java.time.LocalDateTime; //禁止并发执行 Component DisallowConcurrentExecution public class Complex implements Job{ Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException{ System.out.prientln(RAMJobStor复杂执行LocalDateTime.now()); } }import org.springfremework.context.annotation.Bean; import org.springfremework.context.annotation.Configuration; import org.springfremework.scheduling.concurrent.ThreadPoolTaskScheduler; //定时任务线程池配置 Configuration public class SchedulerTaskConfig{ Bean(handConfigTaskScheduler) public ThreadPoolTaskScheduler threadPoolTaskScheduler (){ return new ThreadPoolTaskScheduler(); } }让我们来写一个可运行的例子吧package com.meet.scheduler.job; Slf4j DisallowConcurrentExecution Component public class AScheduler implements Job{ Resource private BusinessSchedulerLockService businessSchedulerLockService; //业务服务 Resource private BusinessService BusinessService; Override public void execute(JobExecutionContext jobExecutionContext) throws JobWxcutionException{ //这里有个乐观锁先验证是否有锁的信息如果没有就插入有就返回 SchedulerLock schedulerLock businessSchedulerLockService.selectByLockName(updateStatus); //直接更新锁如果更新条数为1则说明抢锁成功。将锁状态改为1 int rst schedulerLockService.updateLockStatusUsed(schedulerLock); if(rst 1){ log.info(抢到锁开始执行任务); try{ Thread.sleep(5000); log.info(任务开始); businessService.updateStatus(Constatnt.START,schedulerLock); log.info(任务结束); }catch(InterruptedException e){ throw new RuntimeException(e); } }else { log.info(获取锁失败本次放弃拉取); } } }在业务服务的实现类中直接实现update的方法public class BusinessServiceImpl implements BusinessService{ Override public void updateStatus(Integer archived, SchedulerLock schedulerLock){ try{ //业务代码 businessMapper.updateStatus(archived); }catch(Exception e){ e.printStATCKtRACE(); }finally{ //无论怎样最后的方法都会执行,执行修改锁的状态改为0的sql businessSchedulerLockService.updateLockStatusReleased(schedulerLock); } }看看BusinessSchedulerLockService中是怎么写的呢Slf4j Service Transactional public class BusinessSchedulerLockService{ Resource private BusinessSchedulerLockMapper businessSchedulerLockMapper; public SchedulerLock selectByLockName(String lockName){ QueryWrapperSchedulerLock queryWapper new QueryWrapper(); queryWrapper.eq(lock_name,lockName); SchedulerLock schedulerLock businessSchedulerLockMapper.selectOne(queryWrapper); if( schedulerLock null || schedulerLock.getLockName null){ SchedulerLock lock new SchedulerLock(); lock.setLockId(UUID.fastUUID().toString()); lock.setLockName(lockName); lock.setLockStatus(0); businessSchedulerLockMapper.insert(lock); return lock; } //没有就加有了就直接返回查询的。 return schedulerLock; } public int updateLockStatusUsed(SchedulerLock schedulerLock){ int rst businessSchedulerLockMapper.updateStatus(schedulerLock.getLockName(),1); return rst; } public void updateLockStatusReleased(SchedulerLock schedulerLock){ businessSchedulerLockMapper.updateStatus(schedulerLock.getLockName(),0); } }在application.yml中还需要添加核心线程数这些spring: task: execution: pool: core-size: 5 #核心线程数最小线程数 max-size: 10 #最大线程数 queue-capacity: 20 #任务队列容量 keep-alive: 60s #线程空闲存活的时间定时任务的实体类在项目启动的时候需要查询这个表中的所有定时任务。 public class BusinessScheduled{ private String schedulerdId; private String scheduledName; private String jobClass; private String jobName; private String triggerName; private String jobStatus; private String cron; }数据库中BusinessScheduled中所对应的值给个参考schedulerdId随机id可以uuid也可以自增scheduledName定时任务名称比如修改材料状态。jobClass是指定时任务具体是哪个类写全路径com.meet.scheduler.job.ConferenceScheduler 。jobStatus状态0不开启1开启jobName和triggerName可以自己起也可生成一个随机的。写一样的也行。cron是最重要的比如是每分钟定时任务运行一次都需要配置在这里才可以。scheduler_lock表中只有三个字段lock_idlock_name,lock_status在项目启动执行定时任务时会自动加入scheduler_lock表中lockstatus的状态默认是0后续如果在进行中就会修改为1执行完成之后会将状态再次改为0。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

面齿轮建模全流程:从Matlab齿面计算到TCA验证 2026/9/1 23:38:22

面齿轮建模全流程:从Matlab齿面计算到TCA验证

简介:本资源面向机械设计、齿轮传动系统开发及CAD/CAE仿真领域的工程师与高校研究者,聚焦面齿轮这一特殊盘形齿轮的高精度参数化建模难题。针对传统CAD软件难以直接生成复杂齿廓曲线的痛点,提供MATLAB编程驱动Pro/E(Creo&#xff…

阅读更多 →
基于YOLOv8的交通违法车窗抛物抓拍系统详解与实战 2026/9/1 23:38:22

基于YOLOv8的交通违法车窗抛物抓拍系统详解与实战

简介:本资源是一套基于YOLOv8实现的交通违法车窗抛物智能识别系统,面向计算机、人工智能、自动化等专业本科生及初学者,解决城市交通监管中动态抛物行为自动抓拍与取证的技术难点,适用于毕业设计、课程设计、大作业及项目原型验证…

阅读更多 →
std::numeric_limits<float>:一段深夜调试的浮点数探险 2026/9/1 23:38:22

std::numeric_limits<float>:一段深夜调试的浮点数探险

上周在折腾一个数值计算的小项目&#xff0c;需要用到浮点数的极值判断。一开始想当然地用FLT_MAX和FLT_MIN&#xff0c;后来翻cppreference才发现C11之后有更规范的std::numeric_limits<float>。正好手头有台阿贝云的免费云服务器&#xff0c;想着干脆在这上面写个测试程…

阅读更多 →
车载音响体验指南:从硬件调校到音质评估的完整方法论 2026/9/1 23:38:22

车载音响体验指南:从硬件调校到音质评估的完整方法论

这次我们来看一个汽车音响系统的体验项目&#xff0c;它聚焦于岚图追光S这款车型搭载的音响系统&#xff0c;并以经典歌曲《枉凝眉》的龚玥演唱版本作为测试素材。对于关注汽车智能化、座舱娱乐体验&#xff0c;特别是对车载音响音质有要求的用户来说&#xff0c;这是一个非常具…

阅读更多 →
游戏开发进阶:活用矩阵与数组思维,构建清晰高效的游戏逻辑 2026/9/1 23:38:22

游戏开发进阶:活用矩阵与数组思维,构建清晰高效的游戏逻辑

你是不是也遇到过这种情况&#xff1a;想写个小游戏练练手&#xff0c;或者优化一下某个功能&#xff0c;结果一上来就被各种坐标变换、状态管理、碰撞检测绕得晕头转向&#xff1f;代码写着写着就变成了一团乱麻&#xff0c;维护起来比重新写一遍还痛苦。很多人会把问题归结为…

阅读更多 →
LLM应用性能测试:TTFT/TPOT指标拆解与缓存感知的压测落地 2026/9/1 23:35:22

LLM应用性能测试:TTFT/TPOT指标拆解与缓存感知的压测落地

AI应用的质量保障&#xff0c;大家盯着RAG检索命中率、回答忠实度这些"对不对"的指标&#xff0c;但"快不快"——性能测试&#xff0c;往往是最晚补的一课。等线上用户开始骂"转圈圈"才想起来压测&#xff0c;已经晚了。LLM应用的性能测试和传统…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞