部署后,一切运行正常,使用工具类正常获取服务,一段时间后(大约19个小时以上)使用工具类获取服务,抛出此异常,普通类(定时任务类)获取不到Spring服务,但http请求正常访问xxController调用的服务,log4j日志写了此异常信息后停止写入了,前端页面请求服务正常,就是没有日志了;异常日志
java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext
at org.springframework.context.support.AbstractRefreshableApplicationContext.getBeanFactory(AbstractRefreshableApplicationContext.java:170)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:968)
at com.lexiang.util.WebApplicationContextAware.getBean(WebApplicationContextAware.java:27)
at com.lexiang.task.JobGroupEnum$6.run(JobGroupEnum.java:100)
at com.lexiang.task.execute.CronJob.execute(CronJob.java:36)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)获取服务工具类
public class WebApplicationContextAware implements ApplicationContextAware {  public static final Logger logger = Logger.getLogger(WebApplicationContextAware.class);  private static ApplicationContext applicationContext;  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    this.applicationContext = applicationContext;
  }  public static Object getBean(String name) throws BeansException {
    checkApplicationContext();
    return applicationContext.getBean(name);
  }  public static <T> T getBean(Class<T> requiredType) throws BeansException {
    try {
      checkApplicationContext();
      return applicationContext.getBean(requiredType);
    } catch (java.lang.IllegalStateException e) {
      logger.info("beanDefinitionNames: " + Arrays.toString(applicationContext.getBeanDefinitionNames()));
      logger.error("WebApplicationContextAware获取服务失败: " + requiredType.getName(), e);
      logger.error("applicationContext.containsBean(" + requiredType.getSimpleName() + "):"
          + applicationContext.containsBean(requiredType.getSimpleName()));
      return null;
    }
  }  private static void checkApplicationContext() {
    if (applicationContext == null) {
      throw new IllegalStateException("applicaitonContext未注入");
    }
  }
}调用方法
    public boolean run(JobEntity jobEntity) {
      XxxxxService service = WebApplicationContextAware.getBean(XxxxxService.class);
      return service.interestPenaltyJob(jobEntity);
    }

解决方案 »

  1.   

    你这是使用容器来获取对象,现在一般都是使用注解的方式自动注入bean,这样的话比较方便。如果你使用getbean的方法是因为方法为静态方法,spring其实是可以管理static变量的只不过不建议使用所以会报错,建议可以声明静态变量来接收自动注入的bean,试下是否会报错,尝试下其他的方法。网上看了相关报错,试试这篇https://blog.51cto.com/xnatural/1926781