Okay, I finally figured out what I was doing, and would like to change the issue to one on logging.
My SocketManager.service() method was execing code that should have been in initialize. I was using a variable that is set in configure(). The reason it took me so long to find is that I was throwing a ServiceException, but it was not being logged. Code follows: public void service (ServiceManager manager) throws ServiceException { ... if (!m_manager.hasService(m_handler)) { throw new ServiceException ("Handler, " + m_handler + ", is not valid."); } ... } I expected my exception to cause some kind of log event, but there isn't any. I inserted a logging line just before the throw and then from there it all made sense. Mostly this is my fault for being an Avalon novice, but I'm at a loss for why ServiceException disappears into the framework ether. Corey On Tue, 2002-09-10 at 21:19, Corey Jewett wrote: > I'm going to trim out the less relevant stuff for size, if you need the > full files let me know. I also rebuilt fortress off of tonights CVS just > to be sure. > > public class Manager extends DaemonService implements Configurable, > Initializable { > > ... > /** Called when DaemonService is started. */ > public boolean startup () { > ... sanity checks, logs and returns false on failure. > > // m_servers is a vector of strings from configure(). > for (int i = 0; i < m_servers.size(); i++) { > String s = m_servers.elementAt(i).toString(); > > if (getLogger().isDebugEnabled()) { > getLogger().debug("Attempting to lookup: " + s); > } > > try { > //TODO: Figure out why components are not initializing on lookup. > // Otherwise save the configuration and perform lifecycle here??? > m_servers.setElementAt(m_manager.lookup(s), i); > > if (getLogger().isDebugEnabled()) { > getLogger().debug("Found SocketManager: " + s); > } > > } catch (ServiceException se) { > ... returns false after logging. > } > > ... generate log > } > > ... generate log > return true; > } > > ... > } > > public abstract class DaemonService extends StartableService { > ... > } > > public abstract class StartableService extends AbstractLogEnabled > implements Runnable, Serviceable, Startable { > ... complete class attached. > } > > /** This class is looked up by Manager, it should be seeing the full > lifecycle, but is not. */ > public class SocketManager extends StartableService implements > Configurable { > ... complete class attached. > } > > Finally I have two logs, both at the debug level. The first is my code, > axrs.sm-http should have logs indicating SocketManager: configure(), > run(); and StartableService: service(), start(). Instead only the > service() log appears. > > DEBUG 2002-09-10 21:02:01.090 [axrs ] (): No > Container.EXTENSION_MANAGER is given, installing default lifecycle > extension manager with 0 extensions > DEBUG 2002-09-10 21:02:01.178 [axrs ] (): > Component axrs.SocketManager uses handler > org.apache.excalibur.fortress.handler.PerThreadComponentHandler > DEBUG 2002-09-10 21:02:01.187 [axrs ] (): > Component axrs.Manager uses handler > org.apache.excalibur.fortress.handler.PerThreadComponentHandler > DEBUG 2002-09-10 21:02:01.210 [axrs.manager ] (): > Being serviced. > DEBUG 2002-09-10 21:02:01.211 [axrs.manager ] (): > Being configured. > DEBUG 2002-09-10 21:02:01.211 [axrs.manager ] (): > Being initialized. > DEBUG 2002-09-10 21:02:01.212 [axrs.manager ] (): > Manager has: axrs.SocketManager > DEBUG 2002-09-10 21:02:01.212 [axrs.manager ] (): > Initialized. > DEBUG 2002-09-10 21:02:01.212 [axrs.manager ] (): > Started > DEBUG 2002-09-10 21:02:01.214 [axrs.manager ] (): > Starting up. > DEBUG 2002-09-10 21:02:01.214 [axrs.manager ] (): > Attempting to lookup: axrs.SocketManager > DEBUG 2002-09-10 21:02:01.219 [axrs.sm-http ] (): > Being serviced. > DEBUG 2002-09-10 21:02:01.220 [axrs.manager ] (): > Found SocketManager: axrs.SocketManager > DEBUG 2002-09-10 21:02:01.220 [axrs.manager ] (): > Found: axrs.SocketManager > DEBUG 2002-09-10 21:02:01.221 [axrs.manager ] (): > Started. > DEBUG 2002-09-10 21:02:01.221 [axrs.manager ] (): > Running > DEBUG 2002-09-10 21:02:01.221 [axrs.manager ] (): > Going to sleep. > > > > For completeness I've also included the system log: > > DEBUG 2002-09-10 21:02:00.511 [axrs.system.roles.defaults ] (): > setup role: name='cache', role='org.apache.excalibur.cache.Cache', > class='org.apache.excalibur.cache.impl.DefaultCache', > handler='org.apache.excalibur.fortress.handler.ThreadSafeComponentHandler' > DEBUG 2002-09-10 21:02:00.630 [axrs.system.roles.defaults ] (): > setup role: name='lru-cache', role='org.apache.excalibur.cache.Cache', > class='org.apache.excalibur.cache.impl.LRUCache', > handler='org.apache.excalibur.fortress.handler.ThreadSafeComponentHandler' > DEBUG 2002-09-10 21:02:00.637 [axrs.system.roles.defaults ] (): > setup role: name='jdbc-datasource', > role='org.apache.avalon.excalibur.datasource.DataSourceComponent', > class='org.apache.avalon.excalibur.datasource.JdbcDataSource', > handler='org.apache.excalibur.fortress.handler.ThreadSafeComponentHandler' > DEBUG 2002-09-10 21:02:00.644 [axrs.system.roles.defaults ] (): > setup role: name='j2ee-datasource', > role='org.apache.avalon.excalibur.datasource.DataSourceComponent', > class='org.apache.avalon.excalibur.datasource.J2eeDataSource', > handler='org.apache.excalibur.fortress.handler.ThreadSafeComponentHandler' > DEBUG 2002-09-10 21:02:00.645 [axrs.system.roles.defaults ] (): > setup role: name='informix-datasource', > role='org.apache.avalon.excalibur.datasource.DataSourceComponent', > class='org.apache.avalon.excalibur.datasource.InformixDataSource', > handler='org.apache.excalibur.fortress.handler.ThreadSafeComponentHandler' > DEBUG 2002-09-10 21:02:00.647 [axrs.system.roles.defaults ] (): > setup role: name='i18n', > role='org.apache.excalibur.xmlbundle.BundleSelector', > class='org.apache.excalibur.xmlbundle.BundleSelector', > handler='org.apache.excalibur.fortress.handler.ThreadSafeComponentHandler' > DEBUG 2002-09-10 21:02:00.654 [axrs.system.roles.defaults ] (): > setup role: name='monitor', > role='org.apache.avalon.excalibur.monitor.Monitor', > class='org.apache.avalon.excalibur.monitor.ActiveMonitor', > handler='org.apache.excalibur.fortress.handler.ThreadSafeComponentHandler' > DEBUG 2002-09-10 21:02:00.658 [axrs.system.roles.defaults ] (): > setup role: name='passive-monitor', > role='org.apache.avalon.excalibur.monitor.Monitor', > class='org.apache.avalon.excalibur.monitor.PassiveMonitor', > handler='org.apache.excalibur.fortress.handler.ThreadSafeComponentHandler' > DEBUG 2002-09-10 21:02:00.660 [axrs.system.roles.defaults ] (): > setup role: name='xalan-xpath', > role='org.apache.avalon.excalibur.xml.xpath.XPathProcessor', > class='org.apache.avalon.excalibur.xml.xpath.XPathProcessorImpl', > handler='org.apache.excalibur.fortress.handler.ThreadSafeComponentHandler' > DEBUG 2002-09-10 21:02:00.661 [axrs.system.roles.defaults ] (): > setup role: name='jaxpath', > role='org.apache.avalon.excalibur.xml.xpath.XPathProcessor', > class='org.apache.avalon.excalibur.xml.xpath.JaxenProcessorImpl', > handler='org.apache.excalibur.fortress.handler.ThreadSafeComponentHandler' > DEBUG 2002-09-10 21:02:00.663 [axrs.system.roles.defaults ] (): > setup role: name='resolver', > role='org.apache.excalibur.source.SourceResolver', > class='org.apache.excalibur.source.impl.SourceResolverImpl', > handler='org.apache.excalibur.fortress.handler.ThreadSafeComponentHandler' > DEBUG 2002-09-10 21:02:00.672 [axrs.system.roles.defaults ] (): > setup role: name='parser', > role='org.apache.avalon.excalibur.xml.Parser', > class='org.apache.avalon.excalibur.xml.JaxpParser', > handler='org.apache.excalibur.fortress.handler.PerThreadComponentHandler' > DEBUG 2002-09-10 21:02:00.674 [axrs.system.roles.defaults ] (): > setup role: name='xerces-parser', > role='org.apache.avalon.excalibur.xml.Parser', > class='org.apache.avalon.excalibur.xml.XercesParser', > handler='org.apache.excalibur.fortress.handler.FactoryComponentHandler' > DEBUG 2002-09-10 21:02:00.684 [axrs.system.roles ] (): > setup role: name='http-handler', role='axrs.handlers.HTTPHandler', > class='axrs.handlers.HTTPHandler', > handler='org.apache.excalibur.fortress.handler.PerThreadComponentHandler' > DEBUG 2002-09-10 21:02:00.685 [axrs.system.roles ] (): > setup role: name='sm-standard', role='axrs.SocketManager', > class='axrs.SocketManager', > handler='org.apache.excalibur.fortress.handler.PerThreadComponentHandler' > DEBUG 2002-09-10 21:02:00.692 [axrs.system.roles ] (): > setup role: name='manager', role='axrs.Manager', class='axrs.Manager', > handler='org.apache.excalibur.fortress.handler.PerThreadComponentHandler' > DEBUG 2002-09-10 21:02:00.930 [axrs.system.instrument ] (): > Registering Instrumentable: instrument-manager > DEBUG 2002-09-10 21:02:00.957 [axrs.system.instrument ] (): > Registering Instrument: instrument-manager.total-memory > DEBUG 2002-09-10 21:02:01.005 [axrs.system.instrument ] (): > Registering Instrument: instrument-manager.free-memory > DEBUG 2002-09-10 21:02:01.012 [axrs.system.instrument ] (): > Registering Instrument: instrument-manager.memory > DEBUG 2002-09-10 21:02:01.018 [axrs.system.instrument ] (): > Registering Instrument: instrument-manager.active-thread-count > DEBUG 2002-09-10 21:02:01.096 [axrs.system.roles ] (): > looking up class with shorthand 'sm-standard' returning > 'axrs.SocketManager' > DEBUG 2002-09-10 21:02:01.103 [axrs.system.roles ] (): > looking up handler class with class 'axrs.SocketManager' returning > 'org.apache.excalibur.fortress.handler.PerThreadComponentHandler' > DEBUG 2002-09-10 21:02:01.110 [axrs.system.roles ] (): > looking up role with class 'axrs.SocketManager' returning > 'axrs.SocketManager' > DEBUG 2002-09-10 21:02:01.151 [axrs.system.instrument ] (): > Registering Instrumentable: PerThreadComponentHandler > DEBUG 2002-09-10 21:02:01.158 [axrs.system.instrument ] (): > Registering Child Instrumentable: PerThreadComponentHandler.sm-http > DEBUG 2002-09-10 21:02:01.165 [axrs.system.instrument ] (): > Registering Instrument: PerThreadComponentHandler.sm-http.creates > DEBUG 2002-09-10 21:02:01.171 [axrs.system.instrument ] (): > Registering Instrument: PerThreadComponentHandler.sm-http.destroys > DEBUG 2002-09-10 21:02:01.180 [axrs.system.roles ] (): > looking up class with shorthand 'manager' returning 'axrs.Manager' > DEBUG 2002-09-10 21:02:01.185 [axrs.system.roles ] (): > looking up handler class with class 'axrs.Manager' returning > 'org.apache.excalibur.fortress.handler.PerThreadComponentHandler' > DEBUG 2002-09-10 21:02:01.185 [axrs.system.roles ] (): > looking up role with class 'axrs.Manager' returning 'axrs.Manager' > DEBUG 2002-09-10 21:02:01.186 [axrs.system.instrument ] (): > Registering Instrumentable: PerThreadComponentHandler > DEBUG 2002-09-10 21:02:01.186 [axrs.system.instrument ] (): > Registering Child Instrumentable: PerThreadComponentHandler.manager > DEBUG 2002-09-10 21:02:01.187 [axrs.system.instrument ] (): > Registering Instrument: PerThreadComponentHandler.manager.creates > DEBUG 2002-09-10 21:02:01.187 [axrs.system.instrument ] (): > Registering Instrument: PerThreadComponentHandler.manager.destroys > DEBUG 2002-09-10 21:02:01.199 [axrs.system.handler.perthread ] (): > ComponentHandler initialized for: axrs.Manager > DEBUG 2002-09-10 21:02:01.200 [axrs.system.factory ] (): > ComponentFactory creating new instance of axrs.Manager. > DEBUG 2002-09-10 21:02:01.200 [axrs.system.factory ] (): > logger attribute is manager > DEBUG 2002-09-10 21:02:01.215 [axrs.system.handler.perthread ] (): > ComponentHandler initialized for: axrs.SocketManager > DEBUG 2002-09-10 21:02:01.218 [axrs.system.factory ] (): > ComponentFactory creating new instance of axrs.SocketManager. > DEBUG 2002-09-10 21:02:01.218 [axrs.system.factory ] (): > logger attribute is sm-http > > > > On Tue, 2002-09-10 at 05:26, Berin Loritsch wrote: > > Hmmm. I will double check the code--it should be functioning > > properly. I would like to ask to to make sure that there was > > no exceptions thrown durring Configurable or Serviceable stages. > > > > > -----Original Message----- > > > From: Corey Jewett [mailto:[EMAIL PROTECTED]] > > > Sent: Tuesday, September 10, 2002 12:24 AM > > > To: [EMAIL PROTECTED] > > > Subject: [Fortress] Lifecycle not running. > > > > > > > > > I am probably totally overlooking something, but here goes... > > > > > > I have a class SocketManager: > > > > > > public class SocketManager extends StartableService > > > implements Configurable { > > > ... > > > } > > > > > > StartableService looks like this: > > > > > > public abstract class StartableService extends AbstractLogEnabled > > > implements Runnable, Serviceable, Startable { > > > ... > > > } > > > > > > My understanding is that when I lookup SocketManager (which is > > > successful) then configure(), service(), and start() should be called. > > > > > > Instead, according to my logs it's only being serviced. Any > > > pointers would be appreciated. > > > > > > Corey > > > > > > > > > -- > > > To unsubscribe, e-mail: > > > <mailto:avalon-users-> [EMAIL PROTECTED]> > > > For > > > additional commands, > > > e-mail: <mailto:[EMAIL PROTECTED]> > > > > > > > > > -- > > To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> > > For additional commands, e-mail: <mailto:[EMAIL PROTECTED]> > > > > ---- > > package axrs; > > import java.io.IOException; > import java.net.InetAddress; > import java.net.ServerSocket; > import java.net.Socket; > import java.net.UnknownHostException; > > import org.apache.avalon.framework.configuration.Configurable; > import org.apache.avalon.framework.configuration.Configuration; > import org.apache.avalon.framework.configuration.ConfigurationException; > import org.apache.avalon.framework.service.Serviceable; > import org.apache.avalon.framework.service.ServiceException; > import org.apache.avalon.framework.service.ServiceManager; > > /** > * Each SocketDirector manages a serverSocket and directs all incoming requests > * to the appropriate protohandler. > * > * @todo Add inet addy based ACLs here. > * @todo Need to enable Secure Sockets, or a hook for subclassing. > */ > public class SocketManager extends StartableService implements Configurable { > > static String ROLE = "axrs.SocketManager"; > > /** The port for ServerSocket to bind to. */ > protected int m_port = -1; > > /** Set to ServerSocket default of 50, if not set in configuration. */ > protected int m_backlog = 50; > > /** If not specified then invoke ServerSocket(port) and bind to default. */ > protected InetAddress m_inetaddr = null; > > /** The shorthand of the sockethandler to pass incoming sockets to. */ > protected String m_handler = null; > > /** The ServerSocket */ > protected ServerSocket m_socket = null; > > /** Set if the component is configured. */ > protected boolean m_configured = false; > > /** The unique name of this instance. */ > protected String m_name = null; > > /** NOP */ > public SocketManager () {} > > /** > * Expects a configuration with the following attributes: > * + name (String) Required, the unique name of the socketmanager. > * + port (int) Required, the port to bind to. > * + backlog (int) Optional, defaults to 50, see ServerSocket docs. > * + inetaddr (String) Optional, the InetAddress to bind to. > * + so_timeout (int) Optional, interval for ServerSocket to unblock, > * if set it should be > 0. > * > * Additionally a single nested element which is the handler for the socket. > * The nested element may itself have attributes or nested elements that > * define it's configuration, if any. > */ > public void configure (Configuration conf) throws ConfigurationException { > if (m_configured) { > throw new ConfigurationException ("Already configured."); > } > > if (getLogger().isDebugEnabled()) { > getLogger().debug("Being configured."); > } > > // what is my backlog? > m_backlog = conf.getAttributeAsInteger("backlog", m_backlog); > > // what is my inet? > String ia = conf.getAttribute("inetaddr", null); > if (ia != null) { > try { > m_inetaddr = InetAddress.getByName(ia); > } catch (UnknownHostException uhe) { > throw new ConfigurationException("Unknown Host: " + ia); > } > } else { > if (getLogger().isWarnEnabled()) { > getLogger().warn("No inetaddr, did you mean to do this?"); > } > } > > // What's my name? > m_name = conf.getAttribute("name", null); > if (m_name == null) { > throw new ConfigurationException("Name not specified."); > } > > // what is my port? > m_port = conf.getAttributeAsInteger("port", -1); > if (m_port == -1) { > throw new ConfigurationException("Port not defined."); > } > > // what is my handler? > m_handler = conf.getAttribute("protohandler", null); > if (m_handler == null) { > throw new ConfigurationException("No handler specified."); > } > > if (getLogger().isDebugEnabled()) { > getLogger().debug(conf.getName() + " configured."); > } > > // Configuration was valid. > m_configured = true; > } > > public void service (ServiceManager manager) throws ServiceException { > super.service(manager); > > // Can the handler be loaded? > if (!m_manager.hasService(m_handler)) { > throw new ServiceException ("Handler, " + m_handler > + ", is not valid."); > } > > // Preempt any lazy loading of the handler to confirm it's usability. > m_manager.release(m_manager.lookup(m_handler)); > } > > public void run () { > m_executing = false; // until configuration verified. > if (!m_configured) { > getLogger().fatalError( > "Attempted execution of SocketRunner w/o configuring."); > return; > } > > // Instantiate socket using inet? > try { > if (m_inetaddr != null) { > m_socket = new ServerSocket(m_port, m_backlog, m_inetaddr); > } else { > m_socket = new ServerSocket(m_port, m_backlog); > } > } catch (IOException ioe) { > getLogger().fatalError("Unable to create ServerSocket.", ioe); > } > > // ServerSocket was properly configured, so now we're executing. > m_executing = true; > > if (getLogger().isDebugEnabled()) { > getLogger().debug("ServerSocket configured, beginning to accept >connections."); > } > > // Start accepting connections. > while (m_executing) { > try { > Socket s = m_socket.accept(); > > //TODO: Need to fork off the SocketHandler in a runner. > SocketHandler sh = retrieveHandler(); > sh.handle(s); > > } catch (IOException ioe) { > if (!m_executing) { > // SO_TIMEOUT, m_socket is still alive, but dying. > // Time to close the socket. > try { > m_socket.close(); > } catch (IOException ioe2) { > getLogger().warn("Failed to close socket.", ioe2); > } > } else { > getLogger().error("Socket closed unexpectedly.", ioe); > m_executing = false; > } > } catch (Exception e) { > getLogger().fatalError("Problems retrieving handler.", e); > m_executing = false; > } > } > } > > > /** > * Hook for extending the SocketManager to add SocketHandlers. Note only > * extend this method if specifying the appropriate > */ > protected SocketHandler retrieveHandler () throws Exception { > return (SocketHandler)m_manager.lookup(m_handler); > } > } > ---- > > package axrs; > > import org.apache.avalon.framework.activity.Startable; > import org.apache.avalon.framework.logger.AbstractLogEnabled; > import org.apache.avalon.framework.service.Serviceable; > import org.apache.avalon.framework.service.ServiceException; > import org.apache.avalon.framework.service.ServiceManager; > > /** > * Extending classes will implicitly be spawned as a separate thread. > * > * TODO: Funny as it is, this class is not threadsafe. Needs a mutex. > * > * @author <a href="mailto:[EMAIL PROTECTED]">Corey Jewett</a> > * @version CVS $Revision: 1.2 $ $Date: 2002/08/02 20:22:54 $ > */ > public abstract class StartableService extends AbstractLogEnabled > implements Runnable, Serviceable, Startable { > > /** Set if the component is executing. */ > protected boolean m_executing = false; > > /** The executing thread of server. */ > protected Thread m_thread = null; > > /** Set if the component has been serviced. */ > protected boolean m_serviced = false; > > /** The ServiceManager, if we've been serviced. */ > protected ServiceManager m_manager = null; > > /** If we're not already serviced, and the manager is not null... */ > public void service (ServiceManager manager) throws ServiceException { > if (m_serviced) { > if (getLogger().isDebugEnabled()) { > getLogger().debug("Already been serviced."); > } > > return; > } > > if (manager != null) { > if (getLogger().isDebugEnabled()) { > getLogger().debug("Being serviced."); > } > > m_serviced = true; > m_manager = manager; > } > } > > /** > * Starts the container, implicitly invokes run() in a new thread. > * Guarantees that the container is in a startable state, sets m_executing > * to true, and create/starts m_thread. > */ > public void start () { > if (m_thread != null) { > if (getLogger().isErrorEnabled()) { > getLogger().error("Already started."); > } > > return; > } > > if (getLogger().isDebugEnabled()) { > getLogger().debug("Started"); > } > > m_executing = true; > m_thread = new Thread(this); > m_thread.start(); > } > > /** > * Interrupts the thread in run(). > * Guarantees that the container is in a stopable state (i.e. it was > * properly started at some earlier time.), Calls m_thread.interrupt(), > * sets m_executing to false. Note that m_thread is NOT set to null, that > * is the responsiblity of run(). > * @see run() > */ > public void stop () { > if (!m_executing) { > if (getLogger().isErrorEnabled()) { > getLogger().error("Never started."); > } > > return; > } > > if (getLogger().isDebugEnabled()) { > getLogger().debug("Shutdown initiated."); > } > > m_thread.interrupt(); > m_executing = false; > } > > /** > * Contains the logic for subclass execution. Responsible for confirming: > * that m_executing == true before executing any logic, that m_thread = > * null if the logic finishes normally (the container may immediately be > * restarted). > * @see start() > */ > public abstract void run (); > } > > ---- > > -- > To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> > For additional commands, e-mail: <mailto:[EMAIL PROTECTED]> -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>