Package de.hybris.platform.spring.ctx
Class CloseAwareApplicationContext
- java.lang.Object
-
- org.springframework.core.io.DefaultResourceLoader
-
- org.springframework.context.support.AbstractApplicationContext
-
- org.springframework.context.support.GenericApplicationContext
-
- de.hybris.platform.spring.ctx.CloseAwareApplicationContext
-
- All Implemented Interfaces:
java.io.Closeable,java.lang.AutoCloseable,org.springframework.beans.factory.BeanFactory,org.springframework.beans.factory.HierarchicalBeanFactory,org.springframework.beans.factory.ListableBeanFactory,org.springframework.beans.factory.support.BeanDefinitionRegistry,org.springframework.context.ApplicationContext,org.springframework.context.ApplicationEventPublisher,org.springframework.context.ConfigurableApplicationContext,org.springframework.context.Lifecycle,org.springframework.context.MessageSource,org.springframework.core.AliasRegistry,org.springframework.core.env.EnvironmentCapable,org.springframework.core.io.ResourceLoader,org.springframework.core.io.support.ResourcePatternResolver
public class CloseAwareApplicationContext extends org.springframework.context.support.GenericApplicationContextThis class has been built with very basic thread safety constructs. For our purposes the best solution would really be ReentrantReadWriteLock, but we decided not to use it due to a bug with ThreadLocal storage (Bug ID: 6625723) None of the other built-in java classes/constructs was really suitable here...
-
-
Field Summary
-
Fields inherited from class org.springframework.context.support.AbstractApplicationContext
APPLICATION_EVENT_MULTICASTER_BEAN_NAME, LIFECYCLE_PROCESSOR_BEAN_NAME, logger, MESSAGE_SOURCE_BEAN_NAME
-
-
Constructor Summary
Constructors Constructor Description CloseAwareApplicationContext(java.lang.String name)CloseAwareApplicationContext(java.lang.String uid, java.lang.String name)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected voiddoClose()Custom implementation that tries to solve our problems with event dispatching from multiple threads when the context is closing.voidpublishEvent(org.springframework.context.ApplicationEvent event)We do not allow to dispatch events once the closing is in progress.java.lang.StringtoString()-
Methods inherited from class org.springframework.context.support.GenericApplicationContext
cancelRefresh, closeBeanFactory, getAutowireCapableBeanFactory, getBeanDefinition, getBeanFactory, getClassLoader, getDefaultListableBeanFactory, getResource, getResources, isAlias, isBeanNameInUse, refreshBeanFactory, registerAlias, registerBean, registerBean, registerBean, registerBean, registerBeanDefinition, removeAlias, removeBeanDefinition, setAllowBeanDefinitionOverriding, setAllowCircularReferences, setClassLoader, setParent, setResourceLoader
-
Methods inherited from class org.springframework.context.support.AbstractApplicationContext
addApplicationListener, addBeanFactoryPostProcessor, assertBeanFactoryActive, close, containsBean, containsBeanDefinition, containsLocalBean, createEnvironment, destroy, destroyBeans, findAnnotationOnBean, finishBeanFactoryInitialization, finishRefresh, getAliases, getApplicationListeners, getApplicationName, getBean, getBean, getBean, getBean, getBean, getBeanDefinitionCount, getBeanDefinitionNames, getBeanFactoryPostProcessors, getBeanNamesForAnnotation, getBeanNamesForType, getBeanNamesForType, getBeanNamesForType, getBeanProvider, getBeanProvider, getBeansOfType, getBeansOfType, getBeansWithAnnotation, getDisplayName, getEnvironment, getId, getInternalParentBeanFactory, getInternalParentMessageSource, getMessage, getMessage, getMessage, getParent, getParentBeanFactory, getResourcePatternResolver, getStartupDate, getType, initApplicationEventMulticaster, initLifecycleProcessor, initMessageSource, initPropertySources, invokeBeanFactoryPostProcessors, isActive, isPrototype, isRunning, isSingleton, isTypeMatch, isTypeMatch, obtainFreshBeanFactory, onClose, onRefresh, postProcessBeanFactory, prepareBeanFactory, prepareRefresh, publishEvent, publishEvent, refresh, registerBeanPostProcessors, registerListeners, registerShutdownHook, resetCommonCaches, setDisplayName, setEnvironment, setId, start, stop
-
Methods inherited from class org.springframework.core.io.DefaultResourceLoader
addProtocolResolver, clearResourceCaches, getProtocolResolvers, getResourceByPath, getResourceCache
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-
-
-
-
Method Detail
-
publishEvent
public void publishEvent(org.springframework.context.ApplicationEvent event)
We do not allow to dispatch events once the closing is in progress.- Specified by:
publishEventin interfaceorg.springframework.context.ApplicationEventPublisher- Overrides:
publishEventin classorg.springframework.context.support.AbstractApplicationContext
-
doClose
protected void doClose()
Custom implementation that tries to solve our problems with event dispatching from multiple threads when the context is closing. This method first sets "isClosing" flag to prevent any other threads from trying to start publishing events. But there might be some threads that already executepublishEvent(ApplicationEvent)method. We do not want to close Spring Context immediately then, since this might lead to different Spring-related errors. What we do: When there are any such threads, we wait for them to finish. If the threads won't finish pending calls within given timeout, we continue with closing. The timeout value is fixed as TIMEOUT_LOOP_COUNT * SLEEP_TIME milliseconds.- Overrides:
doClosein classorg.springframework.context.support.AbstractApplicationContext
-
toString
public java.lang.String toString()
- Overrides:
toStringin classorg.springframework.context.support.AbstractApplicationContext
-
-