3 import java.util.logging.*;
4 import java.lang.reflect.*;
6 public class ThreadContext extends ThreadGroup {
7 private Logger logger = Logger.getLogger("dolda.jsvc.context");
8 private ThreadGroup workers;
10 public final Responder root;
12 public ThreadContext(ThreadGroup parent, String name, Class<?> bootclass) {
13 super((parent == null)?(Thread.currentThread().getThreadGroup()):parent, name);
14 workers = new ThreadGroup(this, "Worker threads") {
15 public void uncaughtException(Thread t, Throwable e) {
16 logger.log(Level.SEVERE, "Worker thread terminated with an uncaught exception", e);
19 root = bootstrap(bootclass);
22 public void uncaughtException(Thread t, Throwable e) {
23 logger.log(Level.SEVERE, "Service thread " + t.toString() + " terminated with an uncaught exception", e);
26 public void shutdown() {
28 if(root instanceof ContextResponder)
29 ((ContextResponder)root).destroy();
32 public RequestThread respond(Request req) {
33 return(new RequestThread(root, req, workers, "Worker thread " + reqs++));
36 private Responder bootstrap(final Class<?> bootclass) {
37 final Throwable[] err = new Throwable[1];
38 final Responder[] res = new Responder[1];
39 Thread boot = new Thread(this, "JSvc boot thread") {
42 Method cm = bootclass.getMethod("responder");
43 Object resp = cm.invoke(null);
44 if(!(resp instanceof Responder))
45 throw(new ClassCastException("JSvc bootstrapper did not return a responder"));
46 res[0] = (Responder)resp;
47 } catch(NoSuchMethodException e) {
48 logger.log(Level.SEVERE, "Invalid JSvc bootstrapper specified", e);
50 } catch(IllegalAccessException e) {
51 logger.log(Level.SEVERE, "Invalid JSvc bootstrapper specified", e);
53 } catch(InvocationTargetException e) {
54 logger.log(Level.SEVERE, "JSvc bootstrapper failed", e);
62 } catch(InterruptedException e) {
63 logger.log(Level.WARNING, "Interrupted during bootstrapping", e);
65 Thread.currentThread().interrupt();
68 throw(new RuntimeException(err[0]));
70 logger.log(Level.SEVERE, "No responder returned in spite of no error having happened.");
71 throw(new NullPointerException("No responder returned in spite of no error having happened."));