Running tomcat 3.2 on Win2K with MySql. Use Cygwin and Emacs dev tools. I have a simple servlet running under ssl (public-private key) that is dying silently and unexpectedly. It was working flawlessly and then stopped working without there being any change anywhere on my entire machine that I would notice as something that would cause the servlet to die silently (can't get any logging). I don't know where to look next for the problem and hope for some suggestions.
Prior to my latest reboot, I couldn't even 'tail' my tomcat.log. At that time when I ran this very simple servlet that was just working recently, tomcat.log became 416 Kb and wouldn't 'tail'. The servlet accepts a 'post'-method http form submission, and other servlets that do the same but not under ssl still run fine. I can get no 'servlet.log''s from the servlet that is dying. Two reboots ago, tomcat.log was also huge and showed what appeared to be low-level i/o errors from running the dying servlet. The symptoms on the client are that after http form submission the page just flashes (refreshes) and resets itself, with no server error message. The only defining change from when the dying servlet used to work that I can see is that the machine (a laptop running Win2K) shut itself down when on battery -- perhaps it ran low on juice. But all else works fine and since then I've shutdown and rebooted three times, to no avail. web.xml and the simple servlet in question are below, as well as a relevant section from servlet.xml, and the tomcat.log and servlet.log from my latest reboot and attempt. Any clues? servlet.log ------------------------------------------------------- 2002-07-11 22:07:54 - path="/examples" :jsp: init 2002-07-11 22:07:54 - path="/dynasurv" :jsp: init 2002-07-11 22:07:54 - path="/admin" :jsp: init 2002-07-11 22:07:54 - path="/dynasurv.tar.gz" :jsp: init 2002-07-11 22:07:54 - path="/dynasurv.zip" :jsp: init 2002-07-11 22:07:54 - path="/olddynasurv.tar.gz" :jsp: init 2002-07-11 22:07:55 - path="" :jsp: init 2002-07-11 22:07:55 - path="/test" :jsp: init tomcat.log ------------------------------------------------------- 2002-07-11 22:07:45 - ContextManager: Adding context Ctx( /examples ) 2002-07-11 22:07:45 - Ctx( /dynasurv ): Set debug to 9 2002-07-11 22:07:45 - ContextManager: Adding context Ctx( /dynasurv ) 2002-07-11 22:07:45 - ContextManager: Adding context Ctx( /admin ) 2002-07-11 22:07:45 - ContextManager: Adding context Ctx( /dynasurv.tar.gz ) 2002-07-11 22:07:45 - ContextManager: Adding context Ctx( /dynasurv.zip ) 2002-07-11 22:07:45 - ContextManager: Adding context Ctx( /olddynasurv.tar.gz ) 2002-07-11 22:07:45 - ContextManager: Adding context Ctx( ) 2002-07-11 22:07:45 - ContextManager: Adding context Ctx( /test ) 2002-07-11 22:07:54 - Ctx( /dynasurv ): XmlReader - init /dynasurv webapps/dynasurv 2002-07-11 22:07:54 - Ctx( /dynasurv ): Reading C:\Program Files\jakarta-tomcat-3.2.4\webapps\dynasurv\WEB-INF\web.xml 2002-07-11 22:07:54 - Ctx( /dynasurv ): Loading -2147483646 jsp 2002-07-11 22:07:55 - PoolTcpConnector: Starting HttpConnectionHandler on 8080 2002-07-11 22:07:56 - PoolTcpConnector: Starting HttpConnectionHandler on 8443 2002-07-11 22:07:56 - PoolTcpConnector: Starting Ajp12ConnectionHandler on 8007 2002-07-11 22:21:22 - Ctx( /dynasurv ): Get real path /static/QueryTool/index.html C:\Program Files\jakarta-tomcat-3.2.4\webapps\dynasurv\static\QueryTool\index.html C:\Program Files\jakarta-tomcat-3.2.4\webapps\dynasurv 2002-07-11 22:26:06 - Ctx( /dynasurv ): Get real path /static/QueryTool/index.html C:\Program Files\jakarta-tomcat-3.2.4\webapps\dynasurv\static\QueryTool\index.html C:\Program Files\jakarta-tomcat-3.2.4\webapps\dynasurv 2002-07-11 22:26:13 - Ctx( /dynasurv ): Get real path /static/QueryTool/index.html C:\Program Files\jakarta-tomcat-3.2.4\webapps\dynasurv\static\QueryTool\index.html C:\Program Files\jakarta-tomcat-3.2.4\webapps\dynasurv 2002-07-11 22:26:17 - Ctx( /dynasurv ): Get real path /static/QueryTool/index.html C:\Program Files\jakarta-tomcat-3.2.4\webapps\dynasurv\static\QueryTool\index.html C:\Program Files\jakarta-tomcat-3.2.4\webapps\dynasurv >From server.xml: ------------------------------------------------------- <Context path="/dynasurv" docBase="webapps/dynasurv" crossContext="false" debug="9" reloadable="true" > </Context> ------------------------------------------------ >From web.xml: <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"> <web-app> <!-- Servlets: --> <servlet> <servlet-name> DynaForm </servlet-name> <servlet-class> com.treelogic_swe.frameworks.dynaForm.DynaForm </servlet-class> <init-param> <param-name> dbDriver </param-name> <param-value> org.gjt.mm.mysql.Driver </param-value> </init-param> <init-param> <param-name> dbUrl </param-name> <param-value> jdbc:mysql://localhost:3306/survey_test </param-value> </init-param> <init-param> <param-name> dbTable </param-name> <param-value> longtest </param-value> </init-param> <init-param> <param-name> dbRowFormatUrl </param-name> <param-value> file://C:/Program Files/jakarta-tomcat-3.2.4/webapps/dynasurv/WEB-INF/config/survey1.xml </param-value> </init-param> <init-param> <param-name> debug </param-name> <param-value> true </param-value> </init-param> </servlet> <servlet> <servlet-name> QueryTopowest </servlet-name> <servlet-class> com.treelogic_swe.queryTopowest.QueryTopowest </servlet-class> <init-param> <param-name> dbDriver </param-name> <param-value> org.gjt.mm.mysql.Driver </param-value> </init-param> <init-param> <param-name> dbUrl </param-name> <param-value> jdbc:mysql://localhost:3306/survey_test </param-value> </init-param> <init-param> <param-name> dbTable </param-name> <param-value> longtest </param-value> </init-param> <init-param> <param-name> debug </param-name> <param-value> true </param-value> </init-param> </servlet> <!-- Security Constraints --> <security-constraint> <web-resource-collection> <web-resource-name> QueryTopowest </web-resource-name> <url-pattern> /servlet/QueryTopowest </url-pattern> <http-method> GET </http-method> <http-method> POST </http-method> </web-resource-collection> <web-resource-collection> <web-resource-name> QueryTool </web-resource-name> <url-pattern> /static/QueryTool/index.html </url-pattern> </web-resource-collection> <auth-constraint> <role-name> owner </role-name> <role-name> deployer </role-name> </auth-constraint> <user-data-constraint> <transport-guarantee> CONFIDENTIAL </transport-guarantee> </user-data-constraint> </security-constraint> <!-- Login configs: --> <login-config> <auth-method> BASIC </auth-method> <realm-name> Default </realm-name> </login-config> </web-app> Servlet itself (it is really quite simple): ------------------------------------------------ package com.treelogic_swe.queryTopowest; import java.util.Enumeration; import java.io.PrintWriter; import java.io.InputStream; import java.io.FileInputStream; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletContext; import javax.servlet.ServletConfig; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.ServletException; import javax.servlet.UnavailableException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.sql.DriverManager; import java.sql.Connection; import java.sql.Statement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class QueryTopowest extends HttpServlet { private static final String [] SUPPORTED_QUERIES = { "SELECT userEmail FROM longtest", "SELECT userName, userEmail FROM longtest" }; private static final int [] QUERY_NUM_COLUMNS = { 1, 2 }; // todo: create an array of prepared statements, and work from that. private static final String QUERY_KEY = "query_selection"; private static String beginResult = "<br><br><br>----------------- Results: <br>"; // HTTP response strings: private static final String OPENING = "<html><body>"; private static final String CLOSING = "</body></html>"; private static final String FAILED = "Please contact <a href='mailto:[EMAIL PROTECTED]'> " + "technical support</a>."; private static final String QUICK_RESPONSE = "<br>Here is the information " + "you requested. <i>Thank you for using DynaSurv!</i><br>"; private static ServletContext sc = null; private static int uniqueEntryId = -1; private static boolean debug = true; private static String dbTable = null; private Connection conn = null; /** * This method creates the database connection that is shared * across all requests of this servlet * @param config a <code>ServletConfig</code> value * @exception ServletException */ public void init( ServletConfig config ) throws ServletException { sc.log("Starting init method of QueryTopowest."); String highestUniqueId = "SELECT MAX(Survey_Id) FROM longtest"; Statement stmt = null; ResultSet rs = null; InputStream in = null; String url = null; String driver = null; sc = config.getServletContext(); sc.log("\n\n *********** New Session QueryTopowest: Succesfully obtained servlet context for DynaSurv.\n"); debug = (new Boolean(config.getInitParameter("debug"))).booleanValue(); // Get db properties (properties are in the web.xml file): url = config.getInitParameter("dbUrl"); driver = config.getInitParameter("dbDriver"); dbTable = config.getInitParameter("dbTable"); try { /*- * The driver objects register themselves with the driver manager * at the time of loading, * and the following ligne forces the loading of the (MySQL or other) * driver (it registers itself). */ Class.forName(driver).newInstance(); conn = DriverManager.getConnection(url); sc.log("Database connection successfully obtained."); conn.setAutoCommit(false); // Test db connection for integrity: stmt = conn.createStatement(); rs = stmt.executeQuery(highestUniqueId); if (rs.next()) { uniqueEntryId = rs.getInt(1); // Gets the highest unique survey i.d. } sc.log("uniqueEntryId is initialized as "+uniqueEntryId); // Close the statement object, which also closes the resultset. stmt.close(); if (uniqueEntryId < 0) { sc.log("Problem with database connection if " + "this is not a new db table. This db table has no " + "greatest unique entry id number." ); } } catch (ClassNotFoundException e) { String msg = "*** Couldn't load database driver."; sc.log(msg, e); throw new UnavailableException(msg); } catch (SQLException e) { String msg = "*** Couldn't get db connection."; sc.log(msg, e); throw new UnavailableException(msg); } catch (IllegalAccessException e) { String msg = "*** Couldn't get access to db connection."; sc.log(msg, e); throw new UnavailableException(msg); } catch (InstantiationException e) { String msg = "*** Couldn't create db connection."; sc.log(msg, e); throw new UnavailableException(msg); } } /** * Describe <code>doQuery</code> method here. * * @param query a <code>String</code> value * @return a <code>ResultSet</code> value * @exception SQLException if an error occurs */ ResultSet doQuery (String query) throws SQLException { try { PreparedStatement pstmt = null; pstmt = conn.prepareStatement(query); return pstmt.executeQuery(); } catch (java.sql.SQLException e) { String msg = "*** Couldn't get db connection."; sc.log(msg, e); } // end of try-catch return null; } /** * This is the <code>doPost</code> method. * @param req The request submitted by the http user agent. * @param res The response submitted by the servlet, in composed HTML. * @throws ServletException * @throws IOException */ public synchronized void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { ResultSet rs = null; String nameValues = ""; Enumeration reqFieldNames = null; PrintWriter out = null; String rowMsg; String name; int queriesIndex = (new Integer(req.getParameter(QUERY_KEY))).intValue(); // -------------- Get result of database query request: try { rs = doQuery(SUPPORTED_QUERIES[queriesIndex]); } catch (SQLException e) { String msg = "*** Couldn't get db connection."; sc.log(msg, e); throw new UnavailableException(msg); } // end of try-catch // -------------- Prepare http response: sc.log("Preparing http response."); try { out = res.getWriter(); if (debug) { nameValues += "<table style='border-color: green;'>"; reqFieldNames = req.getParameterNames(); while(reqFieldNames.hasMoreElements()) { name = (String)reqFieldNames.nextElement(); nameValues += "<tr><td>" + name + " </td><td>" + req.getParameter(name) + "</td></tr>"; } nameValues += "</table>"; } else { nameValues = QUICK_RESPONSE; } } catch (IOException e) { sc.log("** Problem with I/O: ", e); res.sendError(res.SC_INTERNAL_SERVER_ERROR); } // -------------- Respond to browser: try { nameValues += beginResult; while (rs.next()) { for (int I=0; I < QUERY_NUM_COLUMNS[queriesIndex]; I++) { nameValues += rs.getString( (I+1) ) + " "; } // end of for () nameValues += "<br>"; } // end of while () // Respond to client user agent: try { if (debug) { rowMsg = "SUCCESS."; } else { rowMsg = ""; } out.println(OPENING + rowMsg + nameValues + CLOSING); } catch (Exception e) { sc.log("** Problem with out.println call: ", e); res.sendError(res.SC_INTERNAL_SERVER_ERROR); } } catch (SQLException e) { String msg = "*** Couldn't get db connection."; sc.log(msg, e); throw new UnavailableException(msg); } catch (Exception e) { try { sc.log("** Problem executing db query.", e); res.sendError(res.SC_INTERNAL_SERVER_ERROR); } finally { try { if (conn != null) { conn.close(); } } catch (SQLException g) { sc.log("** Failed to close db connection.", g); res.sendError(res.SC_INTERNAL_SERVER_ERROR); } } } } } -- ". . . / This Cabinet is formd of Gold / And Pearl & Crystal shining bright And within it opens into a World / . . . Another England there I saw / Another London with its Tower Another Thames & other Hills / And another pleasant Surrey Bower . . ." - from "The Crystal Cabinet", a poem by William Blake. -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>