import javax.servlet.*;
public class Servlet extends HttpServlet {
- private Responder root;
- private ThreadGroup workers;
- private long reqs = 0;
+ private ThreadContext tg;
- public void init() throws ServletException {
- workers = new ThreadGroup("JSvc worker threads") {
- public void uncaughtException(Thread t, Throwable e) {
- log("Worker thread terminated with an uncaught exception", e);
- }
- };
- Properties sprop = new Properties();
+ public void init(ServletConfig cfg) throws ServletException {
+ J2eeContext ctx = J2eeContext.create(cfg);
try {
InputStream pi = Servlet.class.getClassLoader().getResourceAsStream("jsvc.properties");
try {
- sprop.load(pi);
+ ctx.loadconfig(pi);
} finally {
pi.close();
}
} catch(IOException e) {
throw(new Error(e));
}
- String clnm = (String)sprop.get("jsvc.bootstrap");
+ String clnm = ctx.libconfig("jsvc.bootstrap", null);
if(clnm == null)
throw(new ServletException("No JSvc bootstrapper specified"));
+ Class<?> bc;
try {
- Class<?> rc = Class.forName(clnm);
- Method cm = rc.getMethod("responder");
- Object resp = cm.invoke(null);
- if(!(resp instanceof Responder))
- throw(new ServletException("JSvc bootstrapper did not return a responder"));
- root = (Responder)resp;
+ bc = Class.forName(clnm);
} catch(ClassNotFoundException e) {
throw(new ServletException("Invalid JSvc bootstrapper specified", e));
- } catch(NoSuchMethodException e) {
- throw(new ServletException("Invalid JSvc bootstrapper specified", e));
- } catch(IllegalAccessException e) {
- throw(new ServletException("Invalid JSvc bootstrapper specified", e));
- } catch(InvocationTargetException e) {
- throw(new ServletException("JSvc bootstrapper failed", e));
}
- ServletContext ctx = getServletContext();
- ctx.setAttribute("jsvc.starttime", System.currentTimeMillis());
+ String tgn;
+ if(ctx.name() != null)
+ tgn = "JSvc service for " + ctx.name();
+ else
+ tgn = "JSvc service";
+ tg = new ThreadContext(null, tgn, ctx, bc);
}
public void destroy() {
- workers.interrupt();
- if(root instanceof ContextResponder)
- ((ContextResponder)root).destroy();
+ tg.shutdown();
}
public void service(HttpServletRequest req, HttpServletResponse resp) {
} catch(UnsupportedEncodingException e) {
throw(new Error(e));
}
- long mynum = reqs++;
Request rr = new J2eeRequest(getServletConfig(), req, resp);
- RequestThread w = new RequestThread(root, rr, workers, "Worker thread " + mynum);
+ RequestThread w = tg.respond(rr);
w.start();
try {
w.join();