diff --git a/spring-integration-core/src/main/java/org/springframework/integration/annotation/Aggregator.java b/spring-integration-core/src/main/java/org/springframework/integration/annotation/Aggregator.java
index 536e8eec8d..11b19670a3 100644
--- a/spring-integration-core/src/main/java/org/springframework/integration/annotation/Aggregator.java
+++ b/spring-integration-core/src/main/java/org/springframework/integration/annotation/Aggregator.java
@@ -34,11 +34,19 @@ import org.springframework.integration.router.AggregatingMessageHandler;
@Documented
@Handler
public @interface Aggregator {
- String defaultReplyChannel() default "";
- String discardChannel() default "";
- long sendTimeout() default AggregatingMessageHandler.DEFAULT_SEND_TIMEOUT;
- long timeout() default AggregatingMessageHandler.DEFAULT_TIMEOUT;
- boolean sendPartialResultsOnTimeout() default false;
- long reaperInterval() default AggregatingMessageHandler.DEFAULT_REAPER_INTERVAL;
- int trackedCorrelationIdCapacity() default AggregatingMessageHandler.DEFAULT_TRACKED_CORRRELATION_ID_CAPACITY;
+
+ String defaultReplyChannel() default "";
+
+ String discardChannel() default "";
+
+ long sendTimeout() default AggregatingMessageHandler.DEFAULT_SEND_TIMEOUT;
+
+ long timeout() default AggregatingMessageHandler.DEFAULT_TIMEOUT;
+
+ boolean sendPartialResultsOnTimeout() default false;
+
+ long reaperInterval() default AggregatingMessageHandler.DEFAULT_REAPER_INTERVAL;
+
+ int trackedCorrelationIdCapacity() default AggregatingMessageHandler.DEFAULT_TRACKED_CORRRELATION_ID_CAPACITY;
+
}
diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/AggregatorParser.java b/spring-integration-core/src/main/java/org/springframework/integration/config/AggregatorParser.java
index 962d35b522..96b430f9c0 100644
--- a/spring-integration-core/src/main/java/org/springframework/integration/config/AggregatorParser.java
+++ b/spring-integration-core/src/main/java/org/springframework/integration/config/AggregatorParser.java
@@ -76,13 +76,13 @@ public class AggregatorParser implements BeanDefinitionParser {
return parseAggregatorElement(element, parserContext, true);
}
- public static BeanDefinition parseAggregatorElement(Element element, ParserContext parserContext, boolean topLevel) {
+
+ private BeanDefinition parseAggregatorElement(Element element, ParserContext parserContext, boolean topLevel) {
final RootBeanDefinition aggregatorDef = new RootBeanDefinition(AggregatingMessageHandler.class);
aggregatorDef.setSource(parserContext.extractSource(element));
final String id = element.getAttribute(ID_ATTRIBUTE);
final String ref = element.getAttribute(REF_ATTRIBUTE);
final String method = element.getAttribute(METHOD_ATTRIBUTE);
-
if (!StringUtils.hasText(ref)) {
throw new MessagingConfigurationException("The 'ref' attribute must be present");
}
@@ -101,7 +101,6 @@ public class AggregatorParser implements BeanDefinitionParser {
String adapterBeanName = parserContext.getReaderContext().generateBeanName(adapterDefinition);
parserContext.registerBeanComponent(new BeanComponentDefinition(adapterDefinition, adapterBeanName));
aggregatorDef.getConstructorArgumentValues().addGenericArgumentValue(new RuntimeBeanReference(adapterBeanName));
-
}
IntegrationNamespaceUtils.setBeanReferenceIfAttributeDefined(aggregatorDef, COMPLETION_STRATEGY_PROPERTY,
element, COMPLETION_STRATEGY_ATTRIBUTE);
diff --git a/spring-integration-core/src/main/java/org/springframework/integration/router/AggregatingMessageHandler.java b/spring-integration-core/src/main/java/org/springframework/integration/router/AggregatingMessageHandler.java
index ed51eb6641..fc4212e002 100644
--- a/spring-integration-core/src/main/java/org/springframework/integration/router/AggregatingMessageHandler.java
+++ b/spring-integration-core/src/main/java/org/springframework/integration/router/AggregatingMessageHandler.java
@@ -63,13 +63,14 @@ import org.springframework.util.CollectionUtils;
public class AggregatingMessageHandler implements MessageHandler, InitializingBean {
public final static long DEFAULT_SEND_TIMEOUT = 1000;
-
+
public final static long DEFAULT_TIMEOUT = 60000;
-
+
public final static long DEFAULT_REAPER_INTERVAL = 1000;
-
+
public final static int DEFAULT_TRACKED_CORRRELATION_ID_CAPACITY = 1000;
-
+
+
private final Log logger = LogFactory.getLog(this.getClass());
private final Aggregator aggregator;
diff --git a/spring-integration-core/src/main/java/org/springframework/integration/router/AggregatorAdapter.java b/spring-integration-core/src/main/java/org/springframework/integration/router/AggregatorAdapter.java
index 6b2bc3fc65..5546c00817 100644
--- a/spring-integration-core/src/main/java/org/springframework/integration/router/AggregatorAdapter.java
+++ b/spring-integration-core/src/main/java/org/springframework/integration/router/AggregatorAdapter.java
@@ -21,8 +21,8 @@ import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.List;
-import org.springframework.integration.MessagingConfigurationException;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.Message;
import org.springframework.integration.util.SimpleMethodInvoker;
@@ -30,10 +30,12 @@ import org.springframework.util.Assert;
import org.springframework.util.ReflectionUtils;
/**
- * Aggregator adapter for methods annotated with {@link org.springframework.integration.annotation.Aggregator @Aggregator} and for
- * <aggregator ref="beanReference"method="methodName"/>
+ * Aggregator adapter for methods annotated with {@link org.springframework.integration.annotation.Aggregator @Aggregator}
+ * and for 'aggregator' elements that include a 'method' attribute
+ * (e.g. <aggregator ref="beanReference" method="methodName"/>).
*
* @author Marius Bogoevici
+ * @author Mark Fisher
*/
public class AggregatorAdapter implements Aggregator {
@@ -41,46 +43,52 @@ public class AggregatorAdapter implements Aggregator {
private final Method method;
+
public AggregatorAdapter(Object object, String methodName) {
Assert.notNull(object, "'object' must not be null");
- Assert.notNull(methodName, "'methodName' must not be null.");
+ Assert.notNull(methodName, "'methodName' must not be null");
this.method = ReflectionUtils.findMethod(object.getClass(), methodName, new Class>[] { Collection.class });
- Assert
- .notNull(this.method, "Method '" + methodName + "'(Collection> args) not found on "
- + object.getClass());
- this.invoker = new SimpleMethodInvoker