package org.fastcatsearch.http.action.management.servers;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.fastcatsearch.cluster.ClusterUtils;
import org.fastcatsearch.cluster.Node;
import org.fastcatsearch.cluster.NodeJobResult;
import org.fastcatsearch.cluster.NodeService;
import org.fastcatsearch.http.ActionAuthority;
import org.fastcatsearch.http.ActionAuthorityLevel;
import org.fastcatsearch.http.ActionMapping;
import org.fastcatsearch.http.action.ActionRequest;
import org.fastcatsearch.http.action.ActionResponse;
import org.fastcatsearch.http.action.AuthAction;
import org.fastcatsearch.job.management.GetRunningJobListJob;
import org.fastcatsearch.job.management.GetRunningJobListJob.JobInfo;
import org.fastcatsearch.job.management.GetRunningJobListJob.RunningJobListInfo;
import org.fastcatsearch.service.ServiceManager;
import org.fastcatsearch.util.ResponseWriter;
import org.fastcatsearch.util.ResultWriterException;
@ActionMapping(value = "/management/servers/running-job-list", authority = ActionAuthority.Servers, authorityLevel = ActionAuthorityLevel.NONE)
public class GetRunningJobListAction extends AuthAction {
@Override
public void doAuthAction(ActionRequest request, ActionResponse response) throws Exception {
String nodeId = request.getParameter("nodeId");
NodeService nodeService = ServiceManager.getInstance().getService(NodeService.class);
ResponseWriter responseWriter = getDefaultResponseWriter(response.getWriter());
List<Node> nodeList = nodeService.getNodeArrayList();
if(nodeId != null && nodeId.length() > 0){
List<Node> list = new ArrayList<Node>();
for(Node node : nodeList){
if(node.id().equals(nodeId)){
list.add(node);
}
}
nodeList = list;
}
responseWriter.object();
GetRunningJobListJob job = new GetRunningJobListJob();
NodeJobResult[] nodeJobResult = ClusterUtils.sendJobToNodeList(job, nodeService, nodeList, true);
for(NodeJobResult jobResult : nodeJobResult) {
if(jobResult.isSuccess()){
Node node = jobResult.node();
Object result = jobResult.result();
if(result != null){
RunningJobListInfo info = (RunningJobListInfo) result;
writeRunningJobList(info, node, responseWriter);
}
}
}
responseWriter.endObject();
responseWriter.done();
}
SimpleDateFormat timeFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
private void writeRunningJobList(RunningJobListInfo info, Node node,
ResponseWriter responseWriter) throws ResultWriterException {
List<JobInfo> list = info.getJobInfoList();
responseWriter.key(node.id()).object()
.key("size").value(list.size())
.key("list").array();
for(JobInfo jobInfo : list) {
responseWriter.object();
responseWriter.key("jobId").value(jobInfo.getJobId())
.key("className").value(jobInfo.getClassName());
responseWriter.key("args").value(jobInfo.getArgs());
responseWriter.key("isScheduled").value(jobInfo.isScheduled());
responseWriter.key("noResult").value(jobInfo.isNoResult());
responseWriter.key("startTime").value(timeFormat.format(new Date(jobInfo.getStartTime())));
responseWriter.key("endTime").value(jobInfo.getEndTime() > 0 ? timeFormat.format(new Date(jobInfo.getEndTime())) : "");
responseWriter.endObject();
}
responseWriter.endArray()
.endObject();
}
}