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")