X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fdolda%2Fjsvc%2Fscgi%2FDirServer.java;h=5d827392545a0d84e264661c2b6a201630a627e6;hb=3299417335913b0886ca80ac0de62d76fc741dbe;hp=8f19d8a115906bcd21609f74fc4887389e650069;hpb=ecbf37771d3f59836e5930caf5f1b2665478eb92;p=jsvc.git diff --git a/src/dolda/jsvc/scgi/DirServer.java b/src/dolda/jsvc/scgi/DirServer.java index 8f19d8a..5d82739 100644 --- a/src/dolda/jsvc/scgi/DirServer.java +++ b/src/dolda/jsvc/scgi/DirServer.java @@ -7,11 +7,14 @@ import java.util.logging.*; import dolda.jsvc.*; import dolda.jsvc.util.*; import dolda.jsvc.j2ee.PosixArgs; +import java.lang.management.ManagementFactory; +import javax.management.*; public class DirServer extends Server { private final Map contexts = new HashMap(); - private final Environment env; + public final Environment env; private final Logger logger = Logger.getLogger("dolda.jsvc.scgi.dirserver"); + private Thread sdhook = null, main = null; public DirServer(ServerSocket sk, Environment env) { super(sk); @@ -25,6 +28,11 @@ public class DirServer extends Server { if(ctx != null) { if(ctx.mtime < file.lastModified()) { ctx.tg.shutdown(); + try { + ManagementFactory.getPlatformMBeanServer().unregisterMBean(ctx.mbean.name); + } catch(InstanceNotFoundException e) { + } catch(MBeanRegistrationException e) { + } contexts.remove(file); ctx = null; act = "reloaded %s as %s"; @@ -32,6 +40,12 @@ public class DirServer extends Server { } if(ctx == null) { ctx = new DSContext(file, env); + try { + ManagementFactory.getPlatformMBeanServer().registerMBean(ctx.mbean, ctx.mbean.name); + } catch(InstanceAlreadyExistsException e) { + } catch(MBeanRegistrationException e) { + } catch(NotCompliantMBeanException e) { + } contexts.put(file, ctx); logger.config(String.format(act, file, ctx.name())); } @@ -51,6 +65,37 @@ public class DirServer extends Server { RequestThread w = ctx.tg.respond(req); w.start(); } + + private class ShutdownHandler extends Thread { + public void run() { + sdhook = null; + DirServer.this.stop(); + try { + main.join(); + } catch(InterruptedException e) {} + } + } + + protected void shutdown() { + try { + if(sdhook != null) + Runtime.getRuntime().removeShutdownHook(sdhook); + } catch(Exception e) {} + synchronized(contexts) { + for(Iterator> i = contexts.entrySet().iterator(); i.hasNext();) { + Map.Entry e = i.next(); + DSContext ctx = e.getValue(); + i.remove(); + ctx.tg.shutdown(); + } + } + super.shutdown(); + try { + ManagementFactory.getPlatformMBeanServer().unregisterMBean(dolda.jsvc.scgi.jmx.Server.name); + } catch(InstanceNotFoundException e) { + } catch(MBeanRegistrationException e) { + } + } private static void usage(PrintStream out) { out.println("usage: dolda.jsvc.scgi.DirServer [-h] [-e CHARSET] [-d DATADIR] PORT"); @@ -97,9 +142,17 @@ public class DirServer extends Server { return; /* Because javac is stupid. :-/ */ } DirServer s = new DirServer(sk, env); + try { + ManagementFactory.getPlatformMBeanServer().registerMBean(new dolda.jsvc.scgi.jmx.Server(s), dolda.jsvc.scgi.jmx.Server.name); + } catch(InstanceAlreadyExistsException e) { + } catch(MBeanRegistrationException e) { + } catch(NotCompliantMBeanException e) { + } if(charset != null) s.headcs = charset; - new Thread(s, "SCGI server thread").start(); + Runtime.getRuntime().addShutdownHook(s.sdhook = s.new ShutdownHandler()); + s.main = new Thread(s, "SCGI server thread"); + s.main.start(); } }