国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Spring4.x整合Quartz2.x動態修改定時器時間(修正多定時器SpringBean異常)

2019-11-08 03:09:05
字體:
來源:轉載
供稿:網友

不久前在工作中遇到動態修改定時器的問題,在網上找了一些例子,大部分的寫法都差不多,看完過后應用到我的項目中,當時解決了這個問題。但隨后我發現這樣一個問題:如果再添加一個定時器,在項目啟動的時候就會出現SPRingBean初始化異常。下面來分析如何解決這個問題:

先來看一下我在百度上看到的此類問題的解決方案, 先修改定時器配置,修改如下:

<bean id="scheduledJob" class="com.web.app.schedule.handlers.CustomScheduledJob"> <property name="schedulerFactory" ref="scheduledJobFactory"/> <property name="triggerKey" ref="scheduledTrigger"/></bean><bean id="scheduledJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="scheduledJob"/> <property name="targetMethod" value="doScheduledJob"/> <property name="concurrent" value="false"/></bean><bean id="scheduledTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="scheduledJobDetail"/> <property name="cronExpression"> <value>*/10 * * * * ?</value> </property></bean><!-- Add scheduled job to project --><bean id="scheduledJobFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="scheduledTrigger"/> </list> </property></bean>12345678910111213141516171819202122232425261234567891011121314151617181920212223242526

在CustomScheduledJob類中注入schedulerFactory和triggerKey,那么就可以在這個類中修改定時器的時間了。 然而添加多個定時器任務后,隨之而來是的項目啟動時,SpringBean裝載時異常: org.springframework.beans.factory.BeanCreationException:…Cannot resolve reference to bean ‘scheduledJobFactory’ while setting bean property ‘schedulerFactory’… 不難看出這是在創建定時器時需要scheduledJobFactory,而scheduledJobFactory的triggers的list里有多個觸發器,這些觸發器都需要實例化,由此出現了嵌套,導致了創建Bean的異常發生,那該如何修正呢?

既然是創建時的嵌套導致的,那我們就要解除嵌套,即在初始化定時器時不要立即傳入scheduledJobFactory的Bean,那么把定時器的配置中的ref改成value,如下:

<bean id="scheduledJob" class="com.web.app.schedule.handlers.CustomScheduledJob"> <property name="schedulerFactory" value="scheduledJobFactory"/> <property name="triggerKey" value="scheduledTrigger"/></bean>12341234

那么問題又來了,我們該如何通過value取得spring的Bean呢? 我們可以通過實現接口applicationContextAware方式,重寫setApplicationContext()的方法,即可取得Spring的Context,然后用getBean()就可以取得Spring容器里的Bean了。 為了把這個問題處理得更漂亮些,可以用一個抽象類去做這些事情,把其中需要的實現的定時任務方法寫成抽象方法,每個定時器去繼承此抽象類就可以了,抽象類的寫法如下:

package com.web.app.schedule;import java.text.ParseException;import org.quartz.Scheduler;import org.quartz.SchedulerException;import org.quartz.impl.triggers.CronTriggerImpl;import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.util.Assert;public abstract class AbstractScheduledJob implements ApplicationContextAware { private static ApplicationContext applicationContext; protected String schedulerFactory; protected String triggerKey; @Override public void setApplicationContext(ApplicationContext appCtx) throws BeansException { applicationContext = appCtx; } public void setSchedulerFactory(String schedulerFactory) { Assert.notNull(schedulerFactory, "Scheduler factory can not be null"); this.schedulerFactory = schedulerFactory; } public void setTriggerKey(String triggerKey) { Assert.notNull(triggerKey, "Trigger key can not be null"); this.triggerKey = triggerKey; } public void resetScheduledJob(String cronExpression) throws SchedulerException, ParseException { Scheduler schedulerFactory = (Scheduler) getObject(this.schedulerFactory); CronTriggerImpl cronTrigger = (CronTriggerImpl) getObject(this.triggerKey); String originCronExpression = cronTrigger.getCronExpression(); if (!originCronExpression.equalsIgnoreCase(cronExpression)) { cronTrigger.setCronExpression(cronExpression); schedulerFactory.rescheduleJob(cronTrigger.getKey(), cronTrigger); } } public abstract void doScheduledJob(); protected Object getObject(String name) { return applicationContext.getBean(name); }}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152531234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253

自定義的定時器里實現需要處理的計劃任務邏輯,寫法如下:

package com.web.app.schedule.handlers;import com.web.app.schedule.AbstractScheduledJob;public class CustomScheduledJob extends AbstractScheduledJob { @Override public void doScheduledJob() { // TODO // 需要處理的計劃任務邏輯 }}1234567891011121312345678910111213

至此,我們的問題得以解決!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 晋城| 仪征市| 浑源县| 禄丰县| 佛冈县| 南漳县| 肥西县| 常德市| 温泉县| 南宁市| 农安县| 平阳县| 龙泉市| 金川县| 昭觉县| 鹤壁市| 沙雅县| 石首市| 天柱县| 沽源县| 田东县| 谢通门县| 宜春市| 饶河县| 富顺县| 鹤岗市| 杭锦旗| 万安县| 南和县| 玛沁县| 峨边| 青川县| 永春县| 庐江县| 高雄市| 阳信县| 兰州市| 沿河| 融水| 吉水县| 北宁市|