我正在使用JDKtimer(在spring项目中)重新加载bean方法来刷新元数据值。我写了以下几行来获取bean。
Long schedulerDelayTime = AppParametersHelper.getLong(SCHEDULER_DELAY_TIME);
Long schedulerRepeatTime = AppParametersHelper.getLong(SCHEDULER_REPEAT_TIME);
ApplicationContext ctx = ApplicationContextUtil.getContext();
IPartyRequestDataCache partyRequestPingService =
(IPartyRequestDataCache) ctx.getBean("partyRequestDataCache");
partyRequestPingService.refreshDataCache();
以这种方式调用JDK计时器
TimerTask partyRequestSchedulertask = new DataCacheRefreshScheduler();
Timer timer = new Timer();
timer.schedule(partyRequestSchedulertask,
schedulerDelayTime,
schedulerRepeatTime);
我遇到了异常
Exception in thread "Timer-2" java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'ref
resh' before accessing beans via the ApplicationContext
at org.springframework.context.support.AbstractRefreshableApplicationContext.getBeanFactory(AbstractRefreshableApplicat
ionContext.java:171)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1045)
at org.tiaa.partyrequest.listener.DataCacheRefreshScheduler.run(DataCacheRefreshScheduler.java:20)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
在控制台中打印此错误后,它正在执行refreshDataCache()。我可以使用try和catch块来捕获此错误,但是有办法避免这种情况。为什么会这样?
还有另一种方法可以使用spring-servlet.xml文件来执行JDK Timer,但是在这里我无法从文件中传递repeatInterval和startDelay的值。
答案 0 :(得分:0)
尝试在@PostCounstuct方法中运行此代码,此时应初始化所有spring bean。
答案 1 :(得分:0)
感谢您的支持。我无法纠正错误,因为我改变了我的方法。我使用了JDK TIMER和spring方法。您可以在以下spring文档Spring documentation for JDK timer
中查找“使用JDK Timer支持”这一短语因为我想使用我使用的属性文件来控制延迟和周期时间
<context:property-placeholder location="classpath:partyrequestws/Timer.properties"/>
这解决了我第一次调用timer时获取异常的问题。
我希望这会有所帮助。如果有任何人感兴趣我将发布整个代码基础坚果,这是非常直接的。
谢谢。