Hi,
*
Informations :*

System :
Ubuntu 10.04 Server

Tomcat :
Using CATALINA_BASE:   /usr/local/tomcat7
Using CATALINA_HOME:   /usr/local/tomcat7
Using CATALINA_TMPDIR: /usr/local/tomcat7/temp
Using JRE_HOME:        /usr/lib/jvm/java-6-sun
Using CLASSPATH:       /usr/local/tomcat7/bin/
bootstrap.jar:/usr/local/tomcat7/bin/tomcat-juli.jar
Server version: Apache Tomcat/7.0.12
Server built:   Apr 1 2011 06:13:02
Server number:  7.0.12.0
OS Name:        Linux
OS Version:     2.6.32-24-server
Architecture:   amd64
JVM Version:    1.6.0_24-b07
JVM Vendor:     Sun Microsystems Inc.

Tomcat script :

# Tomcat auto-start
#
# description: Auto-starts tomcat 7
# processname: tomcat7
# pidfile: /var/run/tomcat.pid

export JAVA_HOME=/usr/lib/jvm/java-6-sun

case $1 in
start)
        sh /usr/local/tomcat7/bin/startup.sh
        ;;
stop)
        sh /usr/local/tomcat7/bin/shutdown.sh
        ;;
restart)
        sh /usr/local/tomcat7/bin/shutdown.sh
        sh /usr/local/tomcat7/bin/startup.sh
        ;;
esac
exit 0


*Problem 1:*

I use Tomcat7 to host a socket server.

My application use ServletContextListener to start as well as to stop (
contextInitialized and contextDestroyed ).


Each time that my socket server receive a connection with :

Socket java.net.ServerSocket.accept()

I put the socket in a thread, and the thread manage the dialog with the
client ( device, not a browser :p )


To manage a pool of thread, I use the class :
ExecutorService


In the thread there is a loop with a    int java.io.Reader.read(char[] cbuf)


My problem is when i want to stop tomcat with :

 sudo /etc/init.d/tomcat stop

I received this event on my application by implementing the class
ServletContextListener and using the function contextDestroyed :

When contextDestroyed is called, I close all the socket and thread. But it
takes time, and because of that, I always have :

SEVERE: The web application [/SERVER] registered the JDBC driver
[org.postgresql.Driver] but failed to unregister it when the web applicatio$
May 19, 2011 4:30:21 PM org.apache.catalina.loader.WebappClassLoader
clearReferencesThreads
SEVERE: The web application [/SERVER] appears to have started a thread named
[pool-3-thread-1] but has failed to stop it. This is very likel$
May 19, 2011 4:30:21 PM org.apache.catalina.loader.WebappClassLoader
clearReferencesThreads
SEVERE: The web application [/SERVER] appears to have started a thread named
[pool-3-thread-2] but has failed to stop it. This is very likel$
May 19, 2011 4:30:21 PM org.apache.catalina.loader.WebappClassLoader
clearReferencesThreads
SEVERE: The web application [/SERVER] appears to have started a thread named
[pool-2-thread-2] but has failed to stop it. This is very likel$
May 19, 2011 4:30:21 PM org.apache.catalina.loader.WebappClassLoader
clearReferencesThreads
SEVERE: The web application [/SERVER] appears to have started a thread named
[pool-3-thread-3] but has failed to stop it. This is very likel$
May 19, 2011 4:30:21 PM org.apache.catalina.loader.WebappClassLoader
clearReferencesThreads


*Question 1 :* Is there a way to change the timeout of the stop function ?

*Question 2 :* I also heard that sometime contextDestroyed and
contextInitialized is called at unexpected time. Is it related to the use of
memory ? By example, if there is a leaked memory, is it possible that tomcat
decide to close all the application and restart it ?

To summarize these questions : " When contextDestroyed is called ? "


*Problem 2 :*

After  sudo /etc/init.d/tomcat stop , I try again to start the server, but i
got :

May 19, 2011 4:28:22 PM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal
performance in production environments was not found on the java.library.pa$
May 19, 2011 4:28:22 PM org.apache.coyote.AbstractProtocolHandler init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
May 19, 2011 4:28:22 PM org.apache.coyote.AbstractProtocolHandler init
SEVERE: Failed to initialize end point associated with ProtocolHandler
["http-bio-8080"]
java.net.BindException: Address already in use <null>:8080
        at org.apache.tomcat.util.net.JIoEndpoint.bind(JIoEndpoint.java:378)
        at
org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:482)
        at
org.apache.coyote.AbstractProtocolHandler.init(AbstractProtocolHandler.java:354)
        at
org.apache.coyote.http11.AbstractHttp11JsseProtocol.init(AbstractHttp11JsseProtocol.java:119)
        at
org.apache.catalina.connector.Connector.initInternal(Connector.java:910)
        at
org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:101)
        at
org.apache.catalina.core.StandardService.initInternal(StandardService.java:559)
        at
org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:101)
        at
org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:781)
        at
org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:101)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:572)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:595)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:262)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:430)
Caused by: java.net.BindException: Address already in use
        at java.net.PlainSocketImpl.socketBind(Native Method)
        at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:383)
        at java.net.ServerSocket.bind(ServerSocket.java:328)
        at java.net.ServerSocket.<init>(ServerSocket.java:194)
        at java.net.ServerSocket.<init>(ServerSocket.java:150)
        at
org.apache.tomcat.util.net.DefaultServerSocketFactory.createSocket(DefaultServerSocketFactory.java:48)
        at org.apache.tomcat.util.net.JIoEndpoint.bind(JIoEndpoint.java:365)


I don't understand, because sockstat -p 8080 give an empty answer :
USER     PROCESS              PID      PROTO  SOURCE ADDRESS
FOREIGN ADDRESS           STATE

And if try to stop again tomcat i got :

java.net.ConnectException: Connection refused
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
        at
java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
        at java.net.Socket.connect(Socket.java:529)
        at java.net.Socket.connect(Socket.java:478)
        at java.net.Socket.<init>(Socket.java:375)
        at java.net.Socket.<init>(Socket.java:189)
        at
org.apache.catalina.startup.Catalina.stopServer(Catalina.java:456)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at
org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:352)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)


*Question 3 : *is that normal ?



Thx for the help !

Reply via email to