Zhiping, even though jk_nt_service is being used to
launch Tomcat, there is a bug in the Java 1.3 runtime under Windows that causes
any java.exe process to be terminated when the user logs off. The bug is
that a console control handler is setup inside of the java runtime that detects
the CTRL_LOGOFF_EVENT that is sent by Windows to each process when the user logs
off and the handler inside of Java 1.3 is terminating the process when this
occurs. This is the correct operation for a normal application running but
not the correct one for a service.
There
is a couple of packages around, one being located at http://www.kcmultimedia.com/javaserv
another at http://www.eworksmart.com/jnt that
handle the CTRL_LOGOFF_EVENT. I tried a couple of these and while I found
that they indeed to stop the application from being terminated by the
CTRL_LOGOFF_EVENT, I found that they interferred with the normal shutdown of
Tomcat. That is, using these packages, I was not able to shutdown Tomcat
cleanly, which caused the servlets to not have their "destroy" method
invoked.
The
reason that this occurs is because the way that these packages work is that they
invoke the Java VM using the JNI interface. When Tomcat is to be
shutdown, the same JNI interface is used to invoke a shutdown method. The
problem occurs because the way that Tomcat (3.x) is shutdown is by using the
APJ interface to send the existing Tomcat instance a APJ shutdown message
(through a TCP connection in fact). These packages send the APJ message
using the JNI interface, but when call returns, they assume that Tomcat is ready
to be shutdown and they then tear down the Java VM running the Tomcat
process. In reality, the Tomcat process has not yet received the APJ
message through its socket interface and as such has not shutdown cleanly and
does not give the servlets a chance to have their "destroy" method
called.
Because my application needs to have the servlet's
"destroy" method called when Tomcat shuts down, I solved this
problem by using the source to "java.exe" launcher as a starting point and then
modified it to install a console control handler that ignores the
CTRL_LOGOFF_EVENT. I called this new launcher "javaex.exe". I then
used jk_nt_service and changed the configuration file references of "java.exe"
to "javaex.exe".
I hope
this helps.
-----Original Message-----
From: Zhiping Wei [mailto:[EMAIL PROTECTED]]
Sent: Wednesday, November 15, 2000 5:38 PM
To: '[EMAIL PROTECTED]'
Subject: Why tomcat NT service get killed when the user log offPlease Help!!!
This is for tomcat 3.2 beta 7 on Windows NT/2000. Tomcat is registed as an NT service using 'jk_nt_service.exe' (under Systemlocal account). It's starts fine but if I log off the windows, tomcat get killed which is not suppose to be. Could anybody tell me why this happen and how to fix it.
-- Zhiping (ext: 307)