You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by Brad Cox PhD <bc...@virtualschool.edu> on 2001/04/24 03:03:46 UTC
ServerSocket not being closed properly.
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()
--
---
Brad Cox, Ph.D.; bcox@virtualschool.edu
Phone: 703 361 4751 Cell: 703 919-9623
http://virtualschool.edu
Re: ServerSocket not being closed properly.
Posted by cm...@yahoo.com.
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()
>
>