需求:

对于quartz定时任务,需要自定义设置cron表达式实现修改定时任务的执行周期。

目前条件:

定时任务是在spring容器启动完毕通过@EventListener监听容器的ContextRefreshedEvent事件读取了quarz.properties文件中cron 表达式更新了定时任务触发器。
用户在修改了定时任务的cron表达式的时候,存放在了数据库中,所以需要从数据库中获取cron,然后重置触发器。这个操作希望在spring容器启动的时候做。

解决方案:

  1. 考虑使用@PostConstruct来做,这个操作在@EventListener之前,可以修改定时任务的注解,从而更新定时任务的触发器cron。
    @PostConstructpublic void resetCron(ContextRefreshedEvent event) {String cron = jmsInfoService.getJmsInfo("jms.cron");if (cron != null) {try {//检查数据库里面有jms.cron就重新定义定时任务,替换触发器JmsDataSyncJob jmsDataSyncJob = new JmsDataSyncJob();Method sysnOldData = jmsDataSyncJob.getClass().getDeclaredMethod("sysnOldData");QuartzScheduled quartzScheduled = sysnOldData.getAnnotation(QuartzScheduled.class);InvocationHandler handler = Proxy.getInvocationHandler(quartzScheduled);Field f = handler.getClass().getDeclaredField("memberValues");f.setAccessible(true);Map<String, Object> memberValue = (Map<String, Object>) f.get(handler);memberValue.put("cron", cron);LogUtil.info("检查数据库里面有jms.cron设置,重新定义定时任务的cron :" + quartzScheduled.cron());} catch (Exception e) {e.printStackTrace();}}}

问题:在启动的时候如果mapper没有被完全加载完毕,会导致空指针错误,无法查询数据库,甚至无法启动spring。

  1. 考虑使用 @EventListener的方式,监听容器的ContextRefreshedEvent事件,读取数据库数据,重置定时任务触发器
  @EventListenerpublic void resetCron(ContextRefreshedEvent event) {String cron = jmsInfoService.getJmsInfo("jms.cron");if (cron != null) {try {System.out.println("执行的任务 start ");for (int i = 0; i < quartzManageService.getCurrentlyExecutingJobs().size(); i++) {System.out.println(quartzManageService.getCurrentlyExecutingJobs().get(i).getTrigger().getKey());}System.out.println("执行的任务  end ");String key = "jmsDataSyncJob" + "." + "sysnOldData";Trigger trigger = TriggerBuilder.newTrigger().withIdentity(key).withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();quartzManageService.rescheduleJob(TriggerKey.triggerKey(key), trigger);} catch (Exception e) {e.printStackTrace();}}}

问题:和quartz一样都是监听容器的刷新事件,会导致执行顺序问题,如果查数据库重置的操作在quartz之前就会导致最终定时任务的cron还是读取的配置文件里面的。所以考虑监听其他的事件,保证在后面执行。

@EventListenerpublic void resetCron(ContextReadyEvent event) {//和上面一样,也可以监听 ContextStartedEvent}

操作成功。

spring容器启动事件监听:
[参考连接] http://zhaoshijie.iteye.com/blog/1974682

spring 容器启动执行重置定时任务相关推荐

  1. 【spring容器启动】之bean的实例化和初始化(文末附:spring循环依赖原理)

    本次我们通过源码介绍ApplicationContext容器初始化流程,主要介绍容器内bean的实例化和初始化过程.ApplicationContext是Spring推出的先进Ioc容器,它继承了旧版 ...

  2. 分析Spring容器启动流程 Spring初始化

    分析Spring容器启动流程 Spring初始化 每当启动Web容器时(例如Tomcat),会读取Web应用中的web.xml文件.以下这段代码就是启动Spring容器的关键代码. ContextLo ...

  3. 【程序报错】Spring容器启动时报异常:Can not set field to com.sun.proxy.$Proxy

    问题 1 异常信息 在Web项目中Spring容器启动的时候,报错信息为Can not set field- to com.sun.proxy.$Proxy. 2 本质 因为JDK实现动态代理业务的时 ...

  4. Spring Boot 启动执行某个方法的三种实现方式

    Spring Boot 启动执行某个方法的三种实现方式 Spring Boot 启动执行某个方法的三种实现方式 第一种方式 @PostConstruct 注解解释 具体实现 第二种方式 Applica ...

  5. 阿里面试真题:Spring容器启动流程

    有情怀,有干货,微信搜索[三太子敖丙]关注这个不一样的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文章. ...

  6. Spring容器启动流程+Bean的生命周期【附源码】

    如果对SpringIoc与Aop的源码感兴趣,可以访问参考:https://javadoop.com/,十分详细. 文章目录 Spring容器的启动全流程 Spring容器关闭流程 Bean 的生命周 ...

  7. spring容器启动事件监听

    原文地址 关键字:spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件) 应用场景: 很多时候我们想要在某个类加载完毕时干某件事情,但是使用了spring管理对象,我 ...

  8. spring项目启动执行特定方法

    1. 方法上加注解@PostConstruct @Compant public class InitDemo{ @PostConstruct public void init(){ //项目启动就会执 ...

  9. Spring容器启动时出现Failed to read schema document错误

    2019独角兽企业重金招聘Python工程师标准>>> schema_reference.4: Failed to read schema document 'tx-3.2.xsd' ...

最新文章

  1. 2021年开源SLAM算法集锦
  2. DateGridView的外观美化
  3. 人人都要学一点深度学习(1)- 为什么我们需要它
  4. 剑指offer:从上往下打印二叉树
  5. 数据库-查看表-创建表-查询表
  6. linux服务器系统内核参数优化
  7. background相关属性
  8. Spring Cloud Sleuth 之Greenwich版本全攻略
  9. 用Python制作小游戏之‘植物大战僵尸’(二)完整代码
  10. 移动办公系统现状分析
  11. 本学期课程教学要解决问题要点备忘录
  12. 网站使用手机相机_谷歌相机安装教程,让你的手机拥有强大的夜拍能力
  13. 魔兽争霸3 the oracle,疯狂SQL之魔兽争霸
  14. Opengl三视图的坐标变换
  15. 2021牛客练习赛90
  16. 迅为IMX6ULL教程更新至2060+页,裸机开发,Linux系统移植,驱动开发,构建文明系统,QT开发,系统编程
  17. 关于Android 手机 开机速度的优化
  18. 2.7 数值分析: 向量的范数
  19. 局域网(LAN),广域网(WAN)和互联网
  20. python判断年份是否为闰年

热门文章

  1. oracle database express database,安装Oracle Database Express Edition 11g时出现问题
  2. 数学计算机 分数乘法,分数乘法的计算方法
  3. 家用计算机中PCB板材质,介绍PCB电路板的主要原材料
  4. 2016年全国高中数学联赛加试T3解答
  5. 元宇宙如何改写人类社会生活
  6. [转] 管理学中的各种理论
  7. 近段时间参加的CTF竞赛部分题目复现(ISCC2020 、GKCTF、网鼎杯)
  8. LeetCode-SQL(八)
  9. 外盘期货分仓软件(如智星系统,信管家)等功能
  10. HDMI 2.0概述