I am running Axis 1.1 with Tomcat 5.0.25 (with Java 1.4.2)
I have a web service call that starts a thread. If axis is stopped by the Tomcat Web Application Manager, the thread continues to run. It doesn't receive an interrupt exception.
Is there a way to have threads started by web services be stopped when Axis stops?
Is there a variable the threads could monitor to see if they should shutdown?
I created a sample .jws and client to illustrate the problem. cp ThreadTest.jws $CATALINA_HOME/webapps/axis java ThreadTestClient show
/* * ThreadTest.jws * Tests starting and stopping a thread in a web service call. */ public class ThreadTest implements Runnable {
/** Prints out a message every 2 seconds. */
public void
run ()
{
for (int i=0; i<300; i++) {
try {
System.out.println ("Inside thread " + i + " " +
Thread.currentThread().toString());
Thread.sleep(2000); // sleep 2 seconds
} catch (InterruptedException ie) {
System.out.println ("Received interrupt, exiting thread: " + ie);
return;
}
}
}
/** Starts a thread with the given name. */
public String
start(String name)
{
ThreadGroup taskGroup = new ThreadGroup("Test Group");
Thread myThread = new Thread(taskGroup, this, name);
myThread.setDaemon(true);
myThread.start(); return ("started " + name);
} /** Sends the thread with the given name an interrupt. */
public String
stop(String name)
{
Thread[] tarray = new Thread[100]; for (int i=0; i<Thread.enumerate(tarray); i++) {
// XXX: check to make sure it is in the expected thread group
if (tarray[i].getName().equals(name)) {
tarray[i].interrupt();
return ("Thread " + name + " stopped");
}
}
return ("Thread " + name + " not found");
}/** Returns a string of all the current active threads. */
public String
show ()
{
String retStr = "";
Thread[] tarray = new Thread[100];
int numThreads = Thread.enumerate(tarray);
if (numThreads == 0) {
return ("No threads found.");
}
for (int i=0; i<numThreads; i++) {
retStr += ((i+1) + ". " + tarray[i].toString() + " " + tarray[i].isInterrupted() + "\n");
}
return (retStr); } }
/* * ThreadTestClient.java * Test client used to test ThreadTest.jws. */ import org.apache.axis.client.Call; import org.apache.axis.client.Service; import org.apache.axis.encoding.XMLType;
import javax.xml.rpc.ParameterMode;
public class ThreadTestClient
{
static void
usage()
{
System.err.println("Usage: ThreadTestClient start <name> | stop <name> | show");
}
public static void
main(String [] args)
throws Exception
{
String endpoint = "http://localhost:8080/axis/ThreadTest.jws"; if (args == null || args.length < 1) {
usage();
return;
} String method = args[0];
String retStr = null;
Object [] objs = null; Service service = new Service();
Call call = (Call) service.createCall();if (method.equals("start") || method.equals("stop")) {
if (args.length != 2) {
usage();
return;
}
call.addParameter (method, XMLType.XSD_STRING, ParameterMode.IN );
objs = new Object [] { args[1] };
} else if (method.equals ("show")) {
objs = new Object [] {};
} else {
usage();
return;
}
call.setTargetEndpointAddress( new java.net.URL(endpoint) );
call.setOperationName( method );
call.setReturnType( XMLType.XSD_STRING ); retStr = (String) call.invoke(objs);
System.out.println("Result: " + retStr);
}
}
This is what I see in catalina.out
Inside thread 7 Thread[hugh,5,Test Group]
Jul 20, 2004 9:42:09 PM org.apache.catalina.core.StandardHostDeployer start
INFO: standardHost.start /axis
Inside thread 8 Thread[hugh,5,Test Group]
Inside thread 9 Thread[hugh,5,Test Group]
Any help would be greatly appreciated. Thanks
_________________________________________________________________
MSN Toolbar provides one-click access to Hotmail from any Web page � FREE download! http://toolbar.msn.click-url.com/go/onm00200413ave/direct/01/
