diff options
author | Jan Bartel | 2014-10-01 03:02:23 +0000 |
---|---|---|
committer | Jan Bartel | 2014-10-01 03:03:39 +0000 |
commit | 149ee0104705200eaa3a2bfe240c8dabbe921788 (patch) | |
tree | d06d9498c20a2b6060abc21c7a028e0565113169 | |
parent | d0fa66ddf0b13f754c6219120156fb66ab90268a (diff) | |
download | org.eclipse.jetty.project-149ee0104705200eaa3a2bfe240c8dabbe921788.tar.gz org.eclipse.jetty.project-149ee0104705200eaa3a2bfe240c8dabbe921788.tar.xz org.eclipse.jetty.project-149ee0104705200eaa3a2bfe240c8dabbe921788.zip |
445157 First redeployed servlet leaks WebAppContext
3 files changed, 24 insertions, 7 deletions
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/HashSessionManager.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/HashSessionManager.java index 53ccd6398e..5bcac2c285 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/HashSessionManager.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/HashSessionManager.java @@ -85,8 +85,9 @@ public class HashSessionManager extends AbstractSessionManager } finally { - if (_timer != null && _timer.isRunning()) - _timer.schedule(this, _scavengePeriodMs, TimeUnit.MILLISECONDS); + if (_timer != null && _timer.isRunning()) { + _task = _timer.schedule(this, _scavengePeriodMs, TimeUnit.MILLISECONDS); + } } } } @@ -111,7 +112,7 @@ public class HashSessionManager extends AbstractSessionManager finally { if (_timer != null && _timer.isRunning()) - _timer.schedule(this, _savePeriodMs, TimeUnit.MILLISECONDS); + _saveTask = _timer.schedule(this, _savePeriodMs, TimeUnit.MILLISECONDS); } } } @@ -138,7 +139,7 @@ public class HashSessionManager extends AbstractSessionManager ServletContext context = ContextHandler.getCurrentContext(); if (context!=null) _timer = (Scheduler)context.getAttribute("org.eclipse.jetty.server.session.timer"); - } + } if (_timer == null) { @@ -148,7 +149,7 @@ public class HashSessionManager extends AbstractSessionManager } else addBean(_timer,false); - + super.doStart(); setScavengePeriod(getScavengePeriod()); @@ -177,12 +178,15 @@ public class HashSessionManager extends AbstractSessionManager { if (_saveTask!=null) _saveTask.cancel(); + _saveTask=null; if (_task!=null) _task.cancel(); + _task=null; _timer=null; } + // This will callback invalidate sessions - where we decide if we will save super.doStop(); @@ -314,6 +318,7 @@ public class HashSessionManager extends AbstractSessionManager _task.cancel(); _task = null; } + _task = _timer.schedule(new Scavenger(),_scavengePeriodMs, TimeUnit.MILLISECONDS); } } diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/JDBCSessionIdManager.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/JDBCSessionIdManager.java index 434cf9dfde..f633e5b93c 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/JDBCSessionIdManager.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/JDBCSessionIdManager.java @@ -604,7 +604,7 @@ public class JDBCSessionIdManager extends AbstractSessionIdManager finally { if (_scheduler != null && _scheduler.isRunning()) - _scheduler.schedule(this, _scavengeIntervalMs, TimeUnit.MILLISECONDS); + _task = _scheduler.schedule(this, _scavengeIntervalMs, TimeUnit.MILLISECONDS); } } } diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ScheduledExecutorScheduler.java b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ScheduledExecutorScheduler.java index 5f8d62a65a..56da1041b7 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ScheduledExecutorScheduler.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ScheduledExecutorScheduler.java @@ -18,6 +18,7 @@ package org.eclipse.jetty.util.thread; +import java.util.concurrent.BlockingQueue; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ThreadFactory; @@ -38,16 +39,23 @@ public class ScheduledExecutorScheduler extends AbstractLifeCycle implements Sch private final String name; private final boolean daemon; private volatile ScheduledThreadPoolExecutor scheduler; + private ClassLoader classloader; public ScheduledExecutorScheduler() { this(null, false); - } + } public ScheduledExecutorScheduler(String name, boolean daemon) { + this (name,daemon, Thread.currentThread().getContextClassLoader()); + } + + public ScheduledExecutorScheduler(String name, boolean daemon, ClassLoader threadFactoryClassLoader) + { this.name = name == null ? "Scheduler-" + hashCode() : name; this.daemon = daemon; + this.classloader = threadFactoryClassLoader; } @Override @@ -60,6 +68,7 @@ public class ScheduledExecutorScheduler extends AbstractLifeCycle implements Sch { Thread thread = new Thread(r, name); thread.setDaemon(daemon); + thread.setContextClassLoader(classloader); return thread; } }); @@ -67,6 +76,8 @@ public class ScheduledExecutorScheduler extends AbstractLifeCycle implements Sch super.doStart(); } + + @Override protected void doStop() throws Exception { @@ -81,6 +92,7 @@ public class ScheduledExecutorScheduler extends AbstractLifeCycle implements Sch ScheduledFuture<?> result = scheduler.schedule(task, delay, unit); return new ScheduledFutureTask(result); } + private class ScheduledFutureTask implements Task { |