INT-3294 Support Implicit Input Channel with Ann.
JIRA: https://jira.springsource.org/browse/INT-3294 Previously, implicit input channel creation was not supported for annotated endpoints. Register a `DirectChannel` if the input channel does not exist in the context.
This commit is contained in:
@@ -29,6 +29,7 @@ import org.springframework.beans.factory.ListableBeanFactory;
|
||||
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
|
||||
import org.springframework.core.annotation.AnnotationUtils;
|
||||
import org.springframework.core.annotation.Order;
|
||||
import org.springframework.integration.channel.DirectChannel;
|
||||
import org.springframework.integration.config.IntegrationConfigUtils;
|
||||
import org.springframework.integration.context.Orderable;
|
||||
import org.springframework.integration.endpoint.AbstractEndpoint;
|
||||
@@ -38,6 +39,7 @@ import org.springframework.integration.support.channel.BeanFactoryChannelResolve
|
||||
import org.springframework.messaging.MessageChannel;
|
||||
import org.springframework.messaging.MessageHandler;
|
||||
import org.springframework.messaging.SubscribableChannel;
|
||||
import org.springframework.messaging.core.DestinationResolutionException;
|
||||
import org.springframework.messaging.core.DestinationResolver;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.ClassUtils;
|
||||
@@ -47,6 +49,7 @@ import org.springframework.util.StringUtils;
|
||||
* Base class for Method-level annotation post-processors.
|
||||
*
|
||||
* @author Mark Fisher
|
||||
* @author Artem Bilan
|
||||
* @author Gary Russell
|
||||
*/
|
||||
public abstract class AbstractMethodAnnotationPostProcessor<T extends Annotation> implements MethodAnnotationPostProcessor<T> {
|
||||
@@ -133,7 +136,18 @@ public abstract class AbstractMethodAnnotationPostProcessor<T extends Annotation
|
||||
AbstractEndpoint endpoint = null;
|
||||
String inputChannelName = (String) AnnotationUtils.getValue(annotation, INPUT_CHANNEL_ATTRIBUTE);
|
||||
if (StringUtils.hasText(inputChannelName)) {
|
||||
MessageChannel inputChannel = this.channelResolver.resolveDestination(inputChannelName);
|
||||
MessageChannel inputChannel;
|
||||
try {
|
||||
inputChannel = this.channelResolver.resolveDestination(inputChannelName);
|
||||
}
|
||||
catch (DestinationResolutionException e) {
|
||||
inputChannel = new DirectChannel();
|
||||
if (this.beanFactory instanceof ConfigurableListableBeanFactory) {
|
||||
ConfigurableListableBeanFactory listableBeanFactory = (ConfigurableListableBeanFactory) this.beanFactory;
|
||||
listableBeanFactory.registerSingleton(inputChannelName, inputChannel);
|
||||
inputChannel = (MessageChannel) listableBeanFactory.initializeBean(inputChannel, inputChannelName);
|
||||
}
|
||||
}
|
||||
Assert.notNull(inputChannel, "failed to resolve inputChannel '" + inputChannelName + "'");
|
||||
Assert.isInstanceOf(SubscribableChannel.class, inputChannel,
|
||||
"The input channel for an Annotation-based endpoint must be a SubscribableChannel.");
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2008 the original author or authors.
|
||||
* Copyright 2002-2014 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.
|
||||
@@ -23,22 +23,24 @@ import static org.junit.Assert.assertTrue;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.context.support.AbstractApplicationContext;
|
||||
import org.springframework.integration.annotation.MessageEndpoint;
|
||||
import org.springframework.integration.annotation.ServiceActivator;
|
||||
import org.springframework.messaging.support.GenericMessage;
|
||||
import org.springframework.messaging.Message;
|
||||
import org.springframework.messaging.MessageChannel;
|
||||
import org.springframework.messaging.MessageDeliveryException;
|
||||
import org.springframework.messaging.PollableChannel;
|
||||
import org.springframework.messaging.support.GenericMessage;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
|
||||
/**
|
||||
* @author Dave Syer
|
||||
* @author Mark Fisher
|
||||
* @author Gary Russell
|
||||
*/
|
||||
@ContextConfiguration
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@@ -69,6 +71,13 @@ public class AnnotatedEndpointActivationTests {
|
||||
return result;
|
||||
}
|
||||
|
||||
@ServiceActivator(inputChannel = "inputImplicit", outputChannel = "output")
|
||||
public String processImplicit(String message) {
|
||||
count++;
|
||||
String result = message + ": " + count;
|
||||
return result;
|
||||
}
|
||||
|
||||
@Before
|
||||
public void resetCount() {
|
||||
count = 0;
|
||||
@@ -88,6 +97,16 @@ public class AnnotatedEndpointActivationTests {
|
||||
assertEquals(1, count);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void sendAndReceiveImplicitInputChannel() {
|
||||
MessageChannel input = this.applicationContext.getBean("inputImplicit", MessageChannel.class);
|
||||
input.send(new GenericMessage<String>("foo"));
|
||||
Message<?> message = this.output.receive(100);
|
||||
assertNotNull(message);
|
||||
assertEquals("foo: 1", message.getPayload());
|
||||
assertEquals(1, count);
|
||||
}
|
||||
|
||||
@Test(expected = MessageDeliveryException.class)
|
||||
public void stopContext() {
|
||||
applicationContext.stop();
|
||||
|
||||
Reference in New Issue
Block a user