Last active
December 16, 2015 18:59
-
-
Save garyrussell/5481779 to your computer and use it in GitHub Desktop.
How to add a completion advice for testing flows that contain an async handoff and the final element produces no reply http://stackoverflow.com/questions/16277487/spring-integration-unit-test-outbound-channel-adapter
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Copyright 2002-2013 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. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
import java.util.Collection; | |
import org.springframework.beans.BeansException; | |
import org.springframework.beans.factory.config.BeanDefinition; | |
import org.springframework.beans.factory.config.BeanFactoryPostProcessor; | |
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; | |
import org.springframework.beans.factory.config.RuntimeBeanReference; | |
import org.springframework.beans.factory.support.BeanDefinitionRegistry; | |
import org.springframework.beans.factory.support.RootBeanDefinition; | |
/** | |
* @author Gary Russell | |
* | |
*/ | |
public class AddCompletionAdvice implements BeanFactoryPostProcessor { | |
private final Collection<String> handlers; | |
private final Collection<String> replyProducingHandlers; | |
public AddCompletionAdvice(Collection<String> handlers, Collection<String> replyProducingHandlers) { | |
this.handlers = handlers; | |
this.replyProducingHandlers = replyProducingHandlers; | |
} | |
@Override | |
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { | |
for (String beanName : handlers) { | |
defineAdviceAndInject(beanFactory, beanName, beanName + "CompletionAdvice"); | |
} | |
for (String beanName : replyProducingHandlers) { | |
String handlerBeanName = beanFactory.getAliases(beanName + ".handler")[0]; | |
defineAdviceAndInject(beanFactory, handlerBeanName, beanName + "CompletionAdvice"); | |
} | |
} | |
private void defineAdviceAndInject(ConfigurableListableBeanFactory beanFactory, String beanName, String adviceBeanName) { | |
BeanDefinition serviceHandler = beanFactory.getBeanDefinition(beanName); | |
BeanDefinition advice = new RootBeanDefinition(CompletionAdvice.class); | |
((BeanDefinitionRegistry) beanFactory).registerBeanDefinition(adviceBeanName, advice); | |
serviceHandler.getPropertyValues().add("adviceChain", new RuntimeBeanReference(adviceBeanName)); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Copyright 2002-2013 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. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
import java.util.concurrent.CountDownLatch; | |
import org.springframework.integration.Message; | |
import org.springframework.integration.handler.advice.AbstractRequestHandlerAdvice; | |
/** | |
* @author Gary Russell | |
* | |
*/ | |
public class CompletionAdvice extends AbstractRequestHandlerAdvice { | |
private final CountDownLatch latch = new CountDownLatch(1); | |
@Override | |
protected Object doInvoke(ExecutionCallback callback, Object target, Message<?> message) throws Exception { | |
Object result = callback.execute(); | |
latch.countDown(); | |
return result; | |
} | |
public CountDownLatch getLatch() { | |
return latch; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="UTF-8"?> | |
<beans xmlns="http://www.springframework.org/schema/beans" | |
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
xmlns:int="http://www.springframework.org/schema/integration" | |
xsi:schemaLocation="http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration-3.0.xsd | |
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> | |
<int:publish-subscribe-channel id="input"/> | |
<int:outbound-channel-adapter id="foo" channel="input" ref="x" method="handle"/> | |
<int:service-activator id="bar" input-channel="input" ref="x"/> | |
<bean class="org.springframework.integration.samples.amqp.AddCompletionAdvice"> | |
<constructor-arg name="handlers"> | |
<list> | |
<value>foo</value> | |
</list> | |
</constructor-arg> | |
<constructor-arg name="replyProducingHandlers"> | |
<list> | |
<value>bar</value> | |
</list> | |
</constructor-arg> | |
</bean> | |
<bean id="x" class="org.springframework.integration.samples.amqp.Foo" /> | |
</beans> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Copyright 2002-2013 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. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
import static org.junit.Assert.assertTrue; | |
import java.util.concurrent.TimeUnit; | |
import org.junit.Test; | |
import org.junit.runner.RunWith; | |
import org.springframework.beans.factory.annotation.Autowired; | |
import org.springframework.integration.Message; | |
import org.springframework.integration.MessageChannel; | |
import org.springframework.integration.message.GenericMessage; | |
import org.springframework.integration.samples.amqp.CompletionAdvice; | |
import org.springframework.test.context.ContextConfiguration; | |
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; | |
/** | |
* @author Gary Russell | |
* | |
*/ | |
@ContextConfiguration | |
@RunWith(SpringJUnit4ClassRunner.class) | |
public class TestAdvice { | |
@Autowired | |
private CompletionAdvice fooCompletionAdvice; | |
@Autowired | |
private CompletionAdvice barCompletionAdvice; | |
@Autowired | |
private MessageChannel input; | |
@Test | |
public void test() throws Exception { | |
Message<?> message = new GenericMessage<String>("Hello, world!"); | |
input.send(message); | |
assertTrue(fooCompletionAdvice.getLatch().await(1, TimeUnit.SECONDS)); | |
assertTrue(barCompletionAdvice.getLatch().await(1, TimeUnit.SECONDS)); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment