部署后,一切运行正常,使用工具类正常获取服务,一段时间后(大约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);
}
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);
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货