Fixed for 3.3, I'm not sure it's very easy for 3.2.2.

The threads are waiting in accept, so one solution is to set "stopped" and
make a dummy connection. The problem is that there are few places that
need to be fixed to support stop/start ( another bug was that logger and 
session expirer threads don't stop ). It may be a bit too much for 3.2.2,
but probably can be done for an eventual 3.2.3 if it's important.

Costin



On Mon, 23 Apr 2001, Brad Cox PhD wrote:

> At 7:06 PM -0500 04/23/2001, Marc Saegesser wrote:
> >I was just about to call the vote for the final release of Tomcat 3.2.2
> ...
> 
> While you're at it, could you ensure that tomcat closes its server 
> socket  instead of relying on the system to do it when the VM exits? 
> This is a long-standing problem that interferes with running tomcat 
> inside  IBM's VisualAge, or (equivalently) building java GUIs for 
> starting and stopping the server.
> 
> Here's what I've been using in a GUI for starting and stopping tomcat.
> 
> private void doStart(String[] args)
> {
>       org.apache.tomcat.startup.Tomcat.main(args);
> }
> private void doStop()
> {
>       String[] stopArgs = new String[] { "-stop" };
>       org.apache.tomcat.startup.Tomcat.main(stopArgs);
> }
> 
> The buttons work the first time they're used. The start buttons fails 
> the second times (either by the same GUI or by any other means during 
> the same VisualAge session) because the server socket is still being 
> held open by the lack of an explicit close. The only way I've found 
> to clear the problem is to exit VisualAge altogether; a SLOOOWWWW 
> process.
> 
> I've seen the same problem in my own applications. The fix was to be 
> SURE that the ServerSocket is closed EXPLICITLY rather than leaving 
> it to the operating system to do when the process exits.
> 
> This session console log may help locate the problem.
> 
> 2001-04-24 08:51:00 - ContextManager: Adding context Ctx( /examples )
> 2001-04-24 08:51:01 - ContextManager: Adding context Ctx( /admin )
> 2001-04-24 08:51:01 - Ctx( /svlt ): Set debug to 9
> 2001-04-24 08:51:01 - ContextManager: Adding context Ctx( /svlt )
> Starting tomcat. Check logs/tomcat.log for error messages
> 2001-04-24 08:51:01 - ContextManager: Adding context Ctx(  )
> 2001-04-24 08:51:01 - ContextManager: Adding context Ctx( /test )
> 2001-04-24 08:51:01 - ContextManager: Adding context Ctx( /digiprop )
> 2001-04-24 08:51:02 - Ctx( /svlt ): XmlReader - init  /svlt /digiprop
> 2001-04-24 08:51:02 - Ctx( /svlt ): Reading /digiprop/WEB-INF/web.xml
> 2001-04-24 08:51:02 - Ctx( /svlt ): Loading -2147483646 jsp
> 2001-04-24 08:51:02 - Ctx( /svlt ): Loading 1 flush
> 2001-04-24 08:51:03 - Ctx( /svlt ): Loading 1 page
> 2001-04-24 08:51:03 - Ctx( /svlt ): Loading 1 login
> FATAL:java.net.SocketException: Address already in use
> java.net.SocketException: Address already in use
>       java.lang.Throwable(java.lang.String)
>       java.lang.Exception(java.lang.String)
>       java.io.IOException(java.lang.String)
>       java.net.SocketException(java.lang.String)
>       void java.net.PlainSocketImpl.socketBind(java.net.InetAddress, int)
>       void java.net.PlainSocketImpl.bind(java.net.InetAddress, int)
>       java.net.ServerSocket(int, int, java.net.InetAddress)
>       java.net.ServerSocket(int, int)
>       java.net.ServerSocket 
> org.apache.tomcat.net.DefaultServerSocketFactory.createSocket(int, 
> int)
>       void org.apache.tomcat.service.PoolTcpEndpoint.startEndpoint()
>       void org.apache.tomcat.service.PoolTcpConnector.start()
>       void org.apache.tomcat.core.ContextManager.start()
>       void org.apache.tomcat.startup.Tomcat.execute(java.lang.String [])
>       void org.apache.tomcat.startup.Tomcat.main(java.lang.String [])
> ----> void digiprop.site.TomcatView.doStart()
>       void digiprop.site.TomcatView.connEtoC2(java.awt.event.ActionEvent)
>       void 
> digiprop.site.TomcatView$IvjEventHandler.actionPerformed(java.awt.event.ActionEvent)
>       void java.awt.Button.processActionEvent(java.awt.event.ActionEvent)
>       void java.awt.Button.processEvent(java.awt.AWTEvent)
>       void java.awt.Component.dispatchEventImpl(java.awt.AWTEvent)
>       void java.awt.Component.dispatchEvent(java.awt.AWTEvent)
>       void java.awt.EventDispatchThread.run()
> 
> 

Reply via email to