Mercurial Hosting > luan
diff src/goodjava/webserver/handlers/DomainHandler.java @ 1443:42c07ecb0ddc
DomainHandler
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 28 Jan 2020 01:16:31 -0700 |
parents | 546edc2df02c |
children | 1b809d2fdf03 |
line wrap: on
line diff
--- a/src/goodjava/webserver/handlers/DomainHandler.java Sat Jan 25 11:27:21 2020 -0500 +++ b/src/goodjava/webserver/handlers/DomainHandler.java Tue Jan 28 01:16:31 2020 -0700 @@ -8,6 +8,10 @@ import java.lang.ref.ReferenceQueue; import java.util.Map; import java.util.HashMap; +import java.util.Set; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.ConcurrentHashMap; import goodjava.logging.Logger; import goodjava.logging.LoggerFactory; import goodjava.webserver.Handler; @@ -22,22 +26,33 @@ public Handler newHandler(String domain); } - private static void close(Handler handler) { - if( handler instanceof Closeable ) { - try { - ((Closeable)handler).close(); - } catch(IOException e) { - logger.error(handler.toString(),e); - } + private static class MyTask extends TimerTask { + private final Set<Handler> dontGc; + + MyTask(Set<Handler> dontGc) { + this.dontGc = dontGc; + } + + public void run() { + dontGc.clear(); + logger.info("dontGc.clear()"); } } + private static final long HOUR = 1000L*60*60; private final Map<String,Reference<Handler>> map = new HashMap<String,Reference<Handler>>(); + private final Set<Handler> dontGc = ConcurrentHashMap.newKeySet(); + private final Timer timer = new Timer(); private final Factory factory; public DomainHandler(Factory factory) { this.factory = factory; + timer.schedule(new MyTask(dontGc),HOUR,HOUR); + } + + protected void finalize() throws Throwable { + timer.cancel(); } public Response handle(Request request) { @@ -47,7 +62,10 @@ int i = host.indexOf(':'); String domain = i == -1 ? host : host.substring(0,i); Handler handler = getHandler(domain); - return handler==null ? null : handler.handle(request); + if( handler==null ) + return null; + dontGc.add(handler); + return handler.handle(request); } public Handler getHandler(String domain) { @@ -78,4 +96,14 @@ } } + private static void close(Handler handler) { + if( handler instanceof Closeable ) { + try { + ((Closeable)handler).close(); + } catch(IOException e) { + logger.error(handler.toString(),e); + } + } + } + }