package com.sun.portal.util;
import com.sun.portal.netlet.econnection.GWRunnable;
import com.sun.portal.util.TaskWrapper;
import com.sun.portal.rproxy.monitoring.MonitoringSubsystem;
import java.util.HashMap;
import java.util.Map;
/**
* author: Noble Paul
* Date: Jun 4, 2004, 12:38:48 PM
*/
public class ThreadMonitorContext {
private static final int STARTED = 1;
public static final int WAITING_IN_QUEUE = 2;
public static final int RUNNING = 3;
public static final int WAITING_FOR_RESP = 4;
public static final ThreadLocal threadLocal = new ThreadLocal();
private final Map attributeStore = new HashMap();
private Runnable task;
private boolean isTaskKnown = false;
private int state;
private long taskStartTime= -1;
private Thread thisThread;
private static final Map threadMonitorContexts = new HashMap();
public void setTask(Runnable runnable) {
this.task = runnable;
if(runnable == null) return;
if (runnable instanceof TaskWrapper) {
TaskWrapper taskWrapper = (TaskWrapper) runnable;
if (taskWrapper.getTask() instanceof GWRunnable) {
isTaskKnown = true;
} else{
isTaskKnown = false;
}
}
}
public Thread getThread() {
return thisThread;
}
public static void startThread() {
ThreadMonitorContext context = new ThreadMonitorContext();
threadLocal.set(context);
synchronized(threadMonitorContexts){
threadMonitorContexts.put(Thread.currentThread().getName(),context);
}
context.state = STARTED;
context.thisThread = Thread.currentThread();
}
public static void endThread(){
synchronized(threadMonitorContexts){
threadMonitorContexts.remove(Thread.currentThread().getName());
}
threadLocal.set(null);
}
public static void waitingInQueue() {
ThreadMonitorContext context = (ThreadMonitorContext) threadLocal.get();
if(context== null) return;
context.state = WAITING_IN_QUEUE;
}
public long getTaskStartTime() {
return taskStartTime;
}
public static void newTask(Runnable task) {
ThreadMonitorContext context = (ThreadMonitorContext) threadLocal.get();
if(context == null) return;
context.setTask(task);
context.taskStartTime = System.currentTimeMillis();
context.state = RUNNING;
MonitoringSubsystem.handleEvent(SRAEvent.START_TASK,context);
}
public static void taskEnds() {
ThreadMonitorContext context = (ThreadMonitorContext) threadLocal.get();
if(context == null || context.state == WAITING_IN_QUEUE) return;
context.state = WAITING_IN_QUEUE;
context.setTask(null);
context.taskStartTime = -1;
MonitoringSubsystem.handleEvent(SRAEvent.END_TASK,context);
}
public Runnable getTask(){
return task;
}
public boolean isTaskKnown() {
return isTaskKnown;
}
public int getState() {
return state;
}
public static Map getThreadMonitorContexts() {
return new HashMap(threadMonitorContexts);
}
public static ThreadMonitorContext getContext(){
ThreadMonitorContext context = (ThreadMonitorContext) threadLocal.get();
return context;
}
public static void storeAttribute(Object key , Object value){
ThreadMonitorContext context = (ThreadMonitorContext) threadLocal.get();
if (context == null) return;
context.attributeStore.put(key, value);
}
public static Object retrieveAttribute(Object key) {
ThreadMonitorContext context = (ThreadMonitorContext) threadLocal.get();
if (context == null) return null;
return context.attributeStore.get(key);
}
}
|