diff --git a/spring-integration-core/pom.xml b/spring-integration-core/pom.xml index abf62e0d09..62ae5a8e8f 100644 --- a/spring-integration-core/pom.xml +++ b/spring-integration-core/pom.xml @@ -28,6 +28,7 @@ org.springframework spring-tx + true org.springframework.commons diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/SourcePollingChannelAdapterFactoryBean.java b/spring-integration-core/src/main/java/org/springframework/integration/config/SourcePollingChannelAdapterFactoryBean.java index fcf1fa38a3..39e0e04a00 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/SourcePollingChannelAdapterFactoryBean.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/SourcePollingChannelAdapterFactoryBean.java @@ -129,6 +129,7 @@ public class SourcePollingChannelAdapterFactoryBean implements FactoryBean adviceChain = new ArrayList(); + final AtomicBoolean adviceApplied = new AtomicBoolean(false); + adviceChain.add(new MethodInterceptor() { + public Object invoke(MethodInvocation invocation) throws Throwable { + adviceApplied.set(true); + return invocation.proceed(); + } + }); + pollerMetadata.setTrigger(new PeriodicTrigger(5000)); + pollerMetadata.setMaxMessagesPerPoll(1); + final AtomicInteger count = new AtomicInteger(); + pollerMetadata.setPollingDecorator(new PollerCallbackDecorator() { + public Object decorate(Object poller) { + count.incrementAndGet(); + return poller; + } + }); + pollerMetadata.setAdviceChain(adviceChain); + factoryBean.setPollerMetadata(pollerMetadata); + factoryBean.setAutoStartup(true); + factoryBean.afterPropertiesSet(); + context.registerEndpoint("testPollingEndpoint", factoryBean.getObject()); + context.refresh(); + Message message = outputChannel.receive(30000); + assertEquals("test", message.getPayload()); + assertEquals(1, count.get()); + assertTrue("adviceChain was not applied", adviceApplied.get()); + } private static class TestSource implements MessageSource { diff --git a/spring-integration-core/src/test/java/org/springframework/integration/dispatcher/PollingTransactionTests.java b/spring-integration-core/src/test/java/org/springframework/integration/dispatcher/PollingTransactionTests.java index a3e940ae9a..e566a6cfca 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/dispatcher/PollingTransactionTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/dispatcher/PollingTransactionTests.java @@ -19,6 +19,7 @@ package org.springframework.integration.dispatcher; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; import java.util.List; @@ -26,17 +27,19 @@ import org.aopalliance.aop.Advice; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.junit.Test; - -import org.springframework.beans.DirectFieldAccessor; +import org.springframework.aop.Advisor; +import org.springframework.aop.framework.Advised; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.integration.Message; import org.springframework.integration.MessageChannel; import org.springframework.integration.core.PollableChannel; import org.springframework.integration.endpoint.PollingConsumer; import org.springframework.integration.message.GenericMessage; +import org.springframework.integration.test.util.TestUtils; import org.springframework.integration.util.TestTransactionManager; import org.springframework.transaction.IllegalTransactionStateException; import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor; /** * @author Mark Fisher @@ -66,8 +69,14 @@ public class PollingTransactionTests { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( "transactionTests.xml", this.getClass()); PollingConsumer advicedPoller = context.getBean("advicedSa", PollingConsumer.class); - List adviceChain = (List) new DirectFieldAccessor(advicedPoller).getPropertyValue("adviceChain"); + List adviceChain = TestUtils.getPropertyValue(advicedPoller, "adviceChain"); assertEquals(2, adviceChain.size()); + Runnable poller = TestUtils.getPropertyValue(advicedPoller, "poller"); + assertTrue("Poller is not Advised", poller instanceof Advised); + Advisor[] advisors = ((Advised)poller).getAdvisors(); + assertEquals(3, advisors.length); + // System.err.println(Arrays.asList(advisors)); + assertTrue("First advisor is not TX", advisors[0] instanceof TransactionAttributeSourceAdvisor); TestTransactionManager txManager = (TestTransactionManager) context.getBean("txManager"); MessageChannel input = (MessageChannel) context.getBean("goodInputWithAdvice"); PollableChannel output = (PollableChannel) context.getBean("output"); diff --git a/spring-integration-core/src/test/java/org/springframework/integration/test/util/TestUtils.java b/spring-integration-core/src/test/java/org/springframework/integration/test/util/TestUtils.java index 04ed5360a3..cb192360f8 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/test/util/TestUtils.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/test/util/TestUtils.java @@ -22,7 +22,6 @@ import static org.junit.Assert.assertThat; import java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy; import org.hamcrest.Matcher; - import org.springframework.beans.DirectFieldAccessor; import org.springframework.beans.FatalBeanException; import org.springframework.beans.factory.BeanFactory; @@ -54,7 +53,7 @@ import org.springframework.util.ErrorHandler; */ public abstract class TestUtils { - public static Object getPropertyValue(Object root, String propertyPath) { + public static T getPropertyValue(Object root, String propertyPath) { Object value = null; DirectFieldAccessor accessor = new DirectFieldAccessor(root); String[] tokens = propertyPath.split("\\."); @@ -69,7 +68,9 @@ public abstract class TestUtils { "intermediate property '" + tokens[i] + "' is null"); } } - return value; + @SuppressWarnings("unchecked") + T result = (T) value; + return result; } @SuppressWarnings("unchecked")