当我尝试从applicationContext获取bean时,BeanFactory未初始化或已经关闭

时间:2013-05-15 12:34:52

标签: spring

我正在使用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的值。

2 个答案:

答案 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时获取异常的问题。

我希望这会有所帮助。如果有任何人感兴趣我将发布整个代码基础坚果,这是非常直接的。

谢谢。