package org.fastcatsearch.job.management;
import java.io.IOException;
import java.util.Map;
import java.util.Map.Entry;
import org.fastcatsearch.common.io.Streamable;
import org.fastcatsearch.exception.FastcatSearchException;
import org.fastcatsearch.ir.io.DataInput;
import org.fastcatsearch.ir.io.DataOutput;
import org.fastcatsearch.job.Job;
import org.fastcatsearch.job.result.BasicStringResult;
import org.json.JSONStringer;
public class GetThreadStateJob extends Job implements Streamable {
private static final long serialVersionUID = -5814628836593851820L;
@Override
public JobResult doRun() throws FastcatSearchException {
try {
Map<Thread, StackTraceElement[]> stackTraceMap = Thread.getAllStackTraces();
JSONStringer stringer = new JSONStringer();
stringer.object()
.key("count").value(stackTraceMap.size())
.key("threadList").array();
for(Entry<Thread, StackTraceElement[]> e : stackTraceMap.entrySet()){
Thread thread = e.getKey();
StackTraceElement[] el = e.getValue();
StringBuffer sb = new StringBuffer();
for(StackTraceElement st : el){
if(sb.length() > 0){
sb.append("\n");
}
sb.append(st.toString());
}
stringer.object()
.key("name").value(thread.getName())
.key("group").value(thread.getThreadGroup().getName())
.key("priority").value(String.valueOf(thread.getPriority()))
.key("tid").value(String.valueOf(thread.getId()))
.key("state").value(String.valueOf(thread.getState()))
.key("daemon").value(thread.isDaemon())
.key("alive").value(thread.isAlive())
.key("interrupt").value(thread.isInterrupted())
.key("stacktrace").value(sb.toString())
.endObject();
}
stringer.endArray().endObject();
BasicStringResult result = new BasicStringResult();
result.setResult(stringer.toString());
return new JobResult(result);
} catch (Exception e) {
logger.error("", e);
}
return new JobResult(null);
}
@Override
public void readFrom(DataInput input) throws IOException { }
@Override
public void writeTo(DataOutput output) throws IOException { }
}