Context has been closed already solution
Error code
With such a piece of code, the context has been closed already
error may occur during running, and once it occurs, it will make an error every time it runs in the future.
@Component
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext context = null;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ApplicationContextExt.context = applicationContext;
}
/**
* This static method allows you to retrieve the desired bean from the Spring context.
*/
public static <T> T getBean(Class<T> cls) {
if (context == null)
throw new IllegalStateException("no application context aviliable.");
try {
return (T) context.getBean(cls); // Wrong!
} catch (BeansException e) {
throw new RuntimeException(e);
}
return (T) null;
}
}
Cause analysis
However, when spring cloud context. Jar
is included in the classpath, because the contextrefresher
class will close the old context when the context is refreshed, so that the context in the static class has been closed, so this error will occur.
Trigger exploration
Find out the direct reason. Find out that a jar that you depend on listens to a notification from MQ. When you hear the message to be refreshed, you will refresh the context, which leads to this phenomenon.