diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/ComponentConfigurer.java b/spring-integration-core/src/main/java/org/springframework/integration/config/ComponentConfigurer.java index 76ab509ba4..7e26935df7 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/ComponentConfigurer.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/ComponentConfigurer.java @@ -49,7 +49,7 @@ public class ComponentConfigurer { RootBeanDefinition endpointDef = new RootBeanDefinition(GenericMessageEndpoint.class); RootBeanDefinition adapterDef = new RootBeanDefinition(DefaultMessageHandlerAdapter.class); adapterDef.getPropertyValues().addPropertyValue("object", new RuntimeBeanReference(objectRef)); - adapterDef.getPropertyValues().addPropertyValue("method", method); + adapterDef.getPropertyValues().addPropertyValue("methodName", method); String adapterName = beanNameGenerator.generateBeanName(adapterDef, this.registry); this.registry.registerBeanDefinition(adapterName, adapterDef); endpointDef.getPropertyValues().addPropertyValue("handler", new RuntimeBeanReference(adapterName)); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/EndpointParser.java b/spring-integration-core/src/main/java/org/springframework/integration/config/EndpointParser.java index 1d6a83b338..6c82739396 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/EndpointParser.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/EndpointParser.java @@ -56,7 +56,7 @@ public class EndpointParser implements BeanDefinitionParser { private static final String OBJECT_PROPERTY = "object"; - private static final String METHOD_PROPERTY = "method"; + private static final String METHOD_NAME_PROPERTY = "methodName"; private static final String PERIOD_ATTRIBUTE = "period"; @@ -84,7 +84,7 @@ public class EndpointParser implements BeanDefinitionParser { if (StringUtils.hasText(handlerMethod)) { BeanDefinition handlerAdapterDef = new RootBeanDefinition(DefaultMessageHandlerAdapter.class); handlerAdapterDef.getPropertyValues().addPropertyValue(OBJECT_PROPERTY, new RuntimeBeanReference(handlerRef)); - handlerAdapterDef.getPropertyValues().addPropertyValue(METHOD_PROPERTY, handlerMethod); + handlerAdapterDef.getPropertyValues().addPropertyValue(METHOD_NAME_PROPERTY, handlerMethod); String adapterBeanName = parserContext.getReaderContext().generateBeanName(handlerAdapterDef); parserContext.registerBeanComponent(new BeanComponentDefinition(handlerAdapterDef, adapterBeanName)); endpointDef.getPropertyValues().addPropertyValue(HANDLER_PROPERTY, new RuntimeBeanReference(adapterBeanName)); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/MessageBusParser.java b/spring-integration-core/src/main/java/org/springframework/integration/config/MessageBusParser.java index 5046c9e526..dddad74466 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/MessageBusParser.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/MessageBusParser.java @@ -20,7 +20,7 @@ import org.w3c.dom.Element; import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.support.AbstractBeanDefinition; -import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; +import org.springframework.beans.factory.xml.AbstractSimpleBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.integration.bus.MessageBus; @@ -29,9 +29,9 @@ import org.springframework.integration.bus.MessageBus; * * @author Mark Fisher */ -public class MessageBusParser extends AbstractSingleBeanDefinitionParser { +public class MessageBusParser extends AbstractSimpleBeanDefinitionParser { - public static final String MESSAGE_BUS_BEAN_NAME = "internal.messageBus"; + public static final String MESSAGE_BUS_BEAN_NAME = "org.springframework.integration.bus.internalMessageBus"; @Override protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/MessageEndpointAnnotationPostProcessor.java b/spring-integration-core/src/main/java/org/springframework/integration/config/MessageEndpointAnnotationPostProcessor.java index 252c9d2ccc..63dd4c1f58 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/MessageEndpointAnnotationPostProcessor.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/MessageEndpointAnnotationPostProcessor.java @@ -29,8 +29,10 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.core.OrderComparator; import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.integration.MessagingConfigurationException; import org.springframework.integration.bus.ConsumerPolicy; import org.springframework.integration.bus.MessageBus; +import org.springframework.integration.channel.ChannelMappingAware; import org.springframework.integration.endpoint.GenericMessageEndpoint; import org.springframework.integration.endpoint.InboundMethodInvokingChannelAdapter; import org.springframework.integration.endpoint.OutboundMethodInvokingChannelAdapter; @@ -42,6 +44,8 @@ import org.springframework.integration.handler.MessageHandlerChain; import org.springframework.integration.handler.annotation.AnnotationHandlerCreator; import org.springframework.integration.handler.annotation.DefaultAnnotationHandlerCreator; import org.springframework.integration.handler.annotation.Handler; +import org.springframework.integration.handler.annotation.Router; +import org.springframework.integration.router.RouterAnnotationHandlerCreator; import org.springframework.util.Assert; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; @@ -75,6 +79,7 @@ public class MessageEndpointAnnotationPostProcessor implements BeanPostProcessor public void afterPropertiesSet() { Assert.notNull(this.messageBus, "messageBus is required"); this.handlerCreators.put(Handler.class, new DefaultAnnotationHandlerCreator()); + this.handlerCreators.put(Router.class, new RouterAnnotationHandlerCreator()); } public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { @@ -139,9 +144,13 @@ public class MessageEndpointAnnotationPostProcessor implements BeanPostProcessor return; } ReflectionUtils.doWithMethods(bean.getClass(), new ReflectionUtils.MethodCallback() { + boolean foundDefaultOutput = false; public void doWith(Method method) throws IllegalArgumentException, IllegalAccessException { Annotation annotation = AnnotationUtils.getAnnotation(method, DefaultOutput.class); if (annotation != null) { + if (foundDefaultOutput) { + throw new MessagingConfigurationException("only one @DefaultOutput allowed per endpoint"); + } OutboundMethodInvokingChannelAdapter adapter = new OutboundMethodInvokingChannelAdapter(); adapter.setObject(bean); adapter.setMethod(method.getName()); @@ -149,6 +158,7 @@ public class MessageEndpointAnnotationPostProcessor implements BeanPostProcessor String channelName = beanName + "-defaultOutputChannel"; messageBus.registerChannel(channelName, adapter); endpoint.setDefaultOutputChannelName(channelName); + foundDefaultOutput = true; return; } } @@ -164,6 +174,17 @@ public class MessageEndpointAnnotationPostProcessor implements BeanPostProcessor Annotation annotation = AnnotationUtils.getAnnotation(method, annotationType); if (annotation != null) { MessageHandler handler = handlerCreators.get(annotationType).createHandler(bean, method, annotation); + if (handler instanceof ChannelMappingAware) { + ((ChannelMappingAware) handler).setChannelMapping(messageBus); + } + if (handler instanceof InitializingBean) { + try { + ((InitializingBean) handler).afterPropertiesSet(); + } + catch (Exception e) { + throw new MessagingConfigurationException("failed to create handler", e); + } + } if (handler != null) { handlers.add(handler); } diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/SubscriberAnnotationPostProcessor.java b/spring-integration-core/src/main/java/org/springframework/integration/config/SubscriberAnnotationPostProcessor.java index cf73bebe7b..8ff4d66322 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/SubscriberAnnotationPostProcessor.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/SubscriberAnnotationPostProcessor.java @@ -82,7 +82,7 @@ public class SubscriberAnnotationPostProcessor implements BeanPostProcessor { if (annotation != null) { String channelName = (String) AnnotationUtils.getValue(annotation, channelNameAttribute); DefaultMessageHandlerAdapter adapter = new DefaultMessageHandlerAdapter(); - adapter.setMethod(method.getName()); + adapter.setMethodName(method.getName()); adapter.setObject(bean); adapter.afterPropertiesSet(); GenericMessageEndpoint endpoint = new GenericMessageEndpoint(); @@ -92,9 +92,6 @@ public class SubscriberAnnotationPostProcessor implements BeanPostProcessor { String endpointName = ClassUtils.getShortNameAsProperty(targetClass) + "-" + method.getName() + "-endpoint"; messageBus.registerEndpoint(endpointName, endpoint); - if (logger.isInfoEnabled()) { - logger.info("registered endpoint: " + endpointName); - } } } }); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/handler/AbstractMessageHandlerAdapter.java b/spring-integration-core/src/main/java/org/springframework/integration/handler/AbstractMessageHandlerAdapter.java index ee3a19533d..1dbaffba8a 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/handler/AbstractMessageHandlerAdapter.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/handler/AbstractMessageHandlerAdapter.java @@ -16,6 +16,9 @@ package org.springframework.integration.handler; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import org.springframework.beans.factory.InitializingBean; import org.springframework.core.Ordered; import org.springframework.integration.endpoint.SimpleMethodInvoker; @@ -36,9 +39,11 @@ import org.springframework.util.Assert; */ public abstract class AbstractMessageHandlerAdapter implements MessageHandler, Ordered, InitializingBean { + protected Log logger = LogFactory.getLog(this.getClass()); + private T object; - private String method; + private String methodName; private MessageMapper mapper = new SimplePayloadMessageMapper(); @@ -56,13 +61,13 @@ public abstract class AbstractMessageHandlerAdapter implements MessageHandler return this.object; } - public void setMethod(String method) { - Assert.notNull(method, "'method' must not be null"); - this.method = method; + public void setMethodName(String methodName) { + Assert.notNull(methodName, "'methodName' must not be null"); + this.methodName = methodName; } - public String getMethod() { - return this.method; + public String getMethodName() { + return this.methodName; } public void setMapper(MessageMapper mapper) { @@ -82,15 +87,15 @@ public abstract class AbstractMessageHandlerAdapter implements MessageHandler return this.order; } - public void afterPropertiesSet() { - this.invoker = new SimpleMethodInvoker(this.object, this.method); + public final void afterPropertiesSet() { + this.invoker = new SimpleMethodInvoker(this.object, this.methodName); } - public Message handle(Message message) { + public final Message handle(Message message) { Object result = this.doHandle(message, invoker); if (result != null) { if (result instanceof Message) { - return (Message) result; + return (Message) result; } return this.mapper.toMessage(result); }