INT-1903 polishing

This commit is contained in:
Mark Fisher
2011-05-16 15:41:42 -04:00
parent bf7bbbabbe
commit a6a950f731
2 changed files with 58 additions and 51 deletions

View File

@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.integration.config;
import java.lang.reflect.Field;
@@ -22,6 +23,7 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.integration.MessageHeaders;
@@ -29,63 +31,62 @@ import org.springframework.integration.MessageHeaders.IdGenerator;
import org.springframework.util.Assert;
import org.springframework.util.ReflectionUtils;
/**
* @author Oleg Zhurakousky
* @since 2.0
* @since 2.0.4
*/
public class IdGeneratorConfigurer implements ApplicationListener<ContextRefreshedEvent>, DisposableBean{
public final class IdGeneratorConfigurer implements ApplicationListener<ContextRefreshedEvent>, DisposableBean {
private final Log logger = LogFactory.getLog(getClass());
public void onApplicationEvent(ContextRefreshedEvent event) {
this.setIdGenerationStrategy(event);
this.setIdGenerator(event.getApplicationContext());
}
public void destroy() throws Exception {
this.resetIdGenerationStrategy();
this.unsetIdGenerator();
}
private void resetIdGenerationStrategy(){
try{
private void setIdGenerator(ApplicationContext context) {
try {
IdGenerator idGeneratorBean = context.getBean(IdGenerator.class);
if (logger.isDebugEnabled()) {
logger.debug("using custom MessageHeaders.IdGenerator [" + idGeneratorBean.getClass() + "]");
}
Field idGeneratorField = ReflectionUtils.findField(MessageHeaders.class, "idGenerator");
ReflectionUtils.makeAccessible(idGeneratorField);
IdGenerator existingIdGenerator = (IdGenerator) idGeneratorField.get(null);
Assert.state(existingIdGenerator == null, "'MessageHeaders.idGenerator' " +
"has already been set and can not be set again");
if (logger.isInfoEnabled()) {
logger.info("Message IDs will be generated using custom IdGenerator [" + idGeneratorBean.getClass() + "]");
}
ReflectionUtils.setField(idGeneratorField, null, idGeneratorBean);
}
catch (NoSuchBeanDefinitionException e) {
// We will use the default.
if (logger.isDebugEnabled()) {
logger.debug("Unable to locate MessageHeaders.IdGenerator. Will use default: UUID.randomUUID()");
}
}
catch (Exception e) {
if (logger.isWarnEnabled()) {
logger.warn("Unexpected exception occurred while accessing idGenerator of MessageHeaders." +
" Will use default: UUID.randomUUID()", e);
}
}
}
private void unsetIdGenerator() {
try {
Field idGeneratorField = ReflectionUtils.findField(MessageHeaders.class, "idGenerator");
ReflectionUtils.makeAccessible(idGeneratorField);
idGeneratorField.set(null, null);
}
catch (Exception ex){
}
catch (Exception e) {
if (logger.isWarnEnabled()) {
logger.warn("Unexpected exception happened while accessing idGenerator of MessageHeaders.", ex);
}
}
}
private void setIdGenerationStrategy(ContextRefreshedEvent event){
try {
IdGenerator idGenerationStrategy =
event.getApplicationContext().getBean(IdGenerator.class);
if (logger.isDebugEnabled()) {
logger.debug("Using MessageHeaders.idGenerator [" + idGenerationStrategy + "]");
}
Field idGeneratorField = ReflectionUtils.findField(MessageHeaders.class, "idGenerator");
ReflectionUtils.makeAccessible(idGeneratorField);
IdGenerator idGenerator = (IdGenerator) idGeneratorField.get(null);
Assert.state(idGenerator == null, "'MessageHeaders.idGenerator' " +
"has already been set and can not be set again");
if (logger.isInfoEnabled()){
logger.info("Message IDs will be generated using custom ID generation strategy: " + idGenerationStrategy);
}
ReflectionUtils.setField(idGeneratorField, null, idGenerationStrategy);
}
catch (NoSuchBeanDefinitionException ex) {
// We need to use the default.
if (logger.isDebugEnabled()) {
logger.debug("Unable to locate MessageHeaders.idGenerator. Will use default UUID.randomUUID()");
}
}
catch (Exception e){
if (logger.isWarnEnabled()) {
logger.warn("Unexpected exception happened while accessing idGenerator of MessageHeaders." +
" Will use default UUID.randomUUID()", e);
logger.warn("Unexpected exception occurred while accessing idGenerator of MessageHeaders.", e);
}
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2010 the original author or authors.
* Copyright 2002-2011 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -46,15 +46,17 @@ class DefaultConfiguringBeanFactoryPostProcessor implements BeanFactoryPostProce
private static final String ERROR_LOGGER_BEAN_NAME = "_org.springframework.integration.errorLogger";
private Log logger = LogFactory.getLog(this.getClass());
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
if (beanFactory instanceof BeanDefinitionRegistry) {
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
this.registerNullChannel(registry);
this.registerErrorChannelIfNecessary(registry);
this.registerTaskSchedulerIfNecessary(registry);
this.registerMessageIdGenerator(registry);
this.registerIdGeneratorConfigurer(registry);
}
else if (logger.isWarnEnabled()) {
logger.warn("BeanFactory is not a BeanDefinitionRegistry. The default '"
@@ -62,18 +64,22 @@ class DefaultConfiguringBeanFactoryPostProcessor implements BeanFactoryPostProce
+ IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME + "' cannot be configured.");
}
}
private void registerMessageIdGenerator(BeanDefinitionRegistry registry){
private void registerIdGeneratorConfigurer(BeanDefinitionRegistry registry) {
String listenerClassName = "org.springframework.integration.config.IdGeneratorConfigurer";
String[] definitionNames = registry.getBeanDefinitionNames();
for (String definitionName : definitionNames) {
BeanDefinition definition = registry.getBeanDefinition(definitionName);
if (listenerClassName.equals(definition.getBeanClassName())){
logger.warn(listenerClassName + " is already registered and will be used");
if (listenerClassName.equals(definition.getBeanClassName())) {
if (logger.isWarnEnabled()) {
logger.warn(listenerClassName + " is already registered and will be used");
}
return;
}
}
BeanDefinitionReaderUtils.registerWithGeneratedName(new RootBeanDefinition(listenerClassName), registry);
}
RootBeanDefinition beanDefinition = new RootBeanDefinition(listenerClassName);
beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, registry);
}
/**