From 2147ac43edc79efc3a6842c472a20af0ccb6baf4 Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Fri, 25 Apr 2008 12:45:12 +0000 Subject: [PATCH] Restricting advice to the "run" method of MessagingTask, and added synchronization for proxy initialization. --- .../endpoint/PollingSourceEndpoint.java | 47 ++++++++++++------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/endpoint/PollingSourceEndpoint.java b/spring-integration-core/src/main/java/org/springframework/integration/endpoint/PollingSourceEndpoint.java index f84ceec665..cbd35b9f7d 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/endpoint/PollingSourceEndpoint.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/endpoint/PollingSourceEndpoint.java @@ -53,6 +53,10 @@ public class PollingSourceEndpoint extends AbstractSourceEndpoint implements Mes private volatile List dispatchAdviceChain; + private volatile boolean proxiesInitialized; + + private final Object proxyInitializationMonitor = new Object(); + public PollingSourceEndpoint(PollableSource source, MessageChannel channel, PollingSchedule schedule) { super(source, channel); @@ -76,22 +80,28 @@ public class PollingSourceEndpoint extends AbstractSourceEndpoint implements Mes } public void initializeProxies() { - if (this.dispatchAdviceChain != null && this.dispatchAdviceChain.size() > 0) { - ProxyFactory proxyFactory = new ProxyFactory(this.dispatcher); - proxyFactory.setInterfaces(new Class[] { PollingDispatcher.class }); - for (Advice advice : this.dispatchAdviceChain) { - proxyFactory.addAdvisor(new DispatchMethodAdvisor(advice)); + synchronized (this.proxyInitializationMonitor) { + if (this.proxiesInitialized) { + return; } - this.dispatcher = (PollingDispatcher) proxyFactory.getProxy(); - this.task = new PollingDispatcherTask(this.dispatcher, this.task.getSchedule()); - } - if (this.taskAdviceChain != null && this.taskAdviceChain.size() > 0) { - ProxyFactory proxyFactory = new ProxyFactory(this.task); - proxyFactory.setInterfaces(new Class[] { MessagingTask.class }); - for (Advice advice : this.taskAdviceChain) { - proxyFactory.addAdvice(advice); + if (this.dispatchAdviceChain != null && this.dispatchAdviceChain.size() > 0) { + ProxyFactory proxyFactory = new ProxyFactory(this.dispatcher); + proxyFactory.setInterfaces(new Class[] { PollingDispatcher.class }); + for (Advice advice : this.dispatchAdviceChain) { + proxyFactory.addAdvisor(new MethodNameAdvisor(advice, "dispatch")); + } + this.dispatcher = (PollingDispatcher) proxyFactory.getProxy(); + this.task = new PollingDispatcherTask(this.dispatcher, this.task.getSchedule()); } - this.task = (MessagingTask) proxyFactory.getProxy(); + if (this.taskAdviceChain != null && this.taskAdviceChain.size() > 0) { + ProxyFactory proxyFactory = new ProxyFactory(this.task); + proxyFactory.setInterfaces(new Class[] { MessagingTask.class }); + for (Advice advice : this.taskAdviceChain) { + proxyFactory.addAdvisor(new MethodNameAdvisor(advice, "run")); + } + this.task = (MessagingTask) proxyFactory.getProxy(); + } + this.proxiesInitialized = true; } } @@ -113,15 +123,18 @@ public class PollingSourceEndpoint extends AbstractSourceEndpoint implements Mes @SuppressWarnings("serial") - private static class DispatchMethodAdvisor extends StaticMethodMatcherPointcutAdvisor { + private static class MethodNameAdvisor extends StaticMethodMatcherPointcutAdvisor { - DispatchMethodAdvisor(Advice advice) { + private final String methodName; + + MethodNameAdvisor(Advice advice, String methodName) { super(advice); + this.methodName = methodName; } @SuppressWarnings("unchecked") public boolean matches(Method method, Class targetClass) { - return method.getName().equals("dispatch"); + return method.getName().equals(methodName); } }