关于调用Spring设置Quartz中动态执行时间解决办法

本文探讨了在Quartz调度器中动态调整CronTrigger的CronExpression及JobDataMap属性时遇到的问题,并提出了解决方案。通过禁用singleton属性并重新创建Trigger和Map对象来避免异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前段时间,工作中遇到了页面动态设置Quartz中的CronTrigger中的CronExpression值的问题,在google中搜索了相关主题文章,虽然能解决部分问题,但不是很理想;比如,在Scheduler第一次启动Job时,可以重复设置CronTrigger的表达式值,都不会出现问题;但在CronTrigger触发启动了Job后,再重复设置CronTrigger的CronExpression值,存在两种情况,一种情况是当Job已经运行完毕,调用Scheduler的reschedulerJob()方法时,如果CronExpresion的表达式值设置植,比如:0 19 30  * * ?(该表示式表示每天晚上9点半准时运行关联的Job),系统当前时间是:20:00(即晚上8点),Job会立马运行起来(很怪异);第二种情况是当业务需求要同时改变Trigger关联的Job时jobDataAsMap属性值,Spring容器中获取指定的Job实例,设置其中的JobDataAsMap,然后再设置CronTrigger的CronExpresion值,调用Scheduler的reschedulerJob()方法时会抛出java.util.Collections.UnmodifiableSetException,主要是Quartz中的Job实现中用到了个不能修改的Map对象;

为了克服以上两种缺陷,本人的做法是在Spring配置CronTrigger时,设置其属性singleton为false(低本版),其他bean默认;在设置CronTrigger的CronExpression时,从Spring容器中获取一个新的Trigger再设置其CronExpression表达式值;第二步从Spring获取Job实例,产生一个新的Map实例,当然使用(java.util.HashMap)了,然后在把必要的参数key和value压入Map中,再调用Job的setJobDataAsMap(java.util.Map)方法,这样就避免使用原来不能修改的HashMap,重新调用Scheduler的reschedulerJob()方法,至此,以上两个问题都避免了。

从以上考虑的方法中存在点不足就是消耗浪费过多资源,比如每次设置下Trigger的表达式值都会重新创建HashMap和Trigger对象。不知道大家有没有其他更好的解决办法呢?^_^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值