Author: davsclaus Date: Tue Feb 28 13:35:16 2012 New Revision: 1294641 URL: http://svn.apache.org/viewvc?rev=1294641&view=rev Log: CAMEL-5049: Fixed memory leak due timer listener not get properly removed when removing routes, when adding/removing a lot of routes at runtime.
Modified: camel/branches/camel-2.9.x/ (props changed) camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/TimerListener.java camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/support/TimerListenerManager.java Propchange: camel/branches/camel-2.9.x/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Tue Feb 28 13:35:16 2012 @@ -1 +1 @@ -/camel/trunk:1243046,1243057,1243234,1244518,1244644,1244859,1244861,1244864,1244870,1244872,1245021,1291555,1291727,1291848,1291864,1292114,1292384,1292725,1292760,1292767,1293079,1293268,1293288,1293330,1293590,1293828,1293852,1293855,1294130,1294482,1294502,1294533,1294588 +/camel/trunk:1243046,1243057,1243234,1244518,1244644,1244859,1244861,1244864,1244870,1244872,1245021,1291555,1291727,1291848,1291864,1292114,1292384,1292725,1292760,1292767,1293079,1293268,1293288,1293330,1293590,1293828,1293852,1293855,1294130,1294482,1294502,1294533,1294588,1294639 Propchange: camel/branches/camel-2.9.x/ ------------------------------------------------------------------------------ Binary property 'svnmerge-integrated' - no diff available. Modified: camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/TimerListener.java URL: http://svn.apache.org/viewvc/camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/TimerListener.java?rev=1294641&r1=1294640&r2=1294641&view=diff ============================================================================== --- camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/TimerListener.java (original) +++ camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/TimerListener.java Tue Feb 28 13:35:16 2012 @@ -29,5 +29,5 @@ public interface TimerListener { * Notification invoked. */ void onTimer(); - + } Modified: camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java URL: http://svn.apache.org/viewvc/camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java?rev=1294641&r1=1294640&r2=1294641&view=diff ============================================================================== --- camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java (original) +++ camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java Tue Feb 28 13:35:16 2012 @@ -214,4 +214,20 @@ public class ManagedRoute extends Manage context.addRouteDefinition(def); } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + ManagedRoute that = (ManagedRoute) o; + + if (!route.equals(that.route)) return false; + + return true; + } + + @Override + public int hashCode() { + return route.hashCode(); + } } Modified: camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/support/TimerListenerManager.java URL: http://svn.apache.org/viewvc/camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/support/TimerListenerManager.java?rev=1294641&r1=1294640&r2=1294641&view=diff ============================================================================== --- camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/support/TimerListenerManager.java (original) +++ camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/support/TimerListenerManager.java Tue Feb 28 13:35:16 2012 @@ -33,6 +33,9 @@ import org.slf4j.LoggerFactory; * <p/> * The {@link #setExecutorService(java.util.concurrent.ScheduledExecutorService)} method * must be invoked prior to starting this manager using the {@link #start()} method. + * <p/> + * Also ensure when adding and remove listeners, that they are correctly removed to avoid + * leaking memory. * * @see TimerListener */ @@ -91,11 +94,27 @@ public class TimerListenerManager extend } } + /** + * Adds the listener. + * <p/> + * It may be important to implement {@link #equals(Object)} and {@link #hashCode()} for the listener + * to ensure that we can remove the same listener again, when invoking remove. + * + * @param listener listener + */ public void addTimerListener(TimerListener listener) { listeners.add(listener); LOG.debug("Added TimerListener: {}", listener); } + /** + * Removes the listener. + * <p/> + * It may be important to implement {@link #equals(Object)} and {@link #hashCode()} for the listener + * to ensure that we can remove the same listener again, when invoking remove. + * + * @param listener listener. + */ public void removeTimerListener(TimerListener listener) { listeners.remove(listener); LOG.debug("Removed TimerListener: {}", listener); @@ -117,5 +136,10 @@ public class TimerListenerManager extend } } + @Override + protected void doShutdown() throws Exception { + super.doShutdown(); + listeners.clear(); + } }