package org.fastcatsearch.http.action.service; import org.fastcatsearch.control.JobService; import org.fastcatsearch.control.ResultFuture; import org.fastcatsearch.http.action.ActionRequest; import org.fastcatsearch.http.action.ActionResponse; import org.fastcatsearch.http.action.ServiceAction; import org.fastcatsearch.job.Job; import org.fastcatsearch.util.ResponseWriter; import org.fastcatsearch.util.ResultWriterException; import org.jboss.netty.handler.codec.http.HttpResponseStatus; import java.io.Writer; public abstract class CallableAction extends ServiceAction { @Override public void doAction(ActionRequest request, ActionResponse response) throws Exception { Writer writer = response.getWriter(); writeHeader(response); response.setStatus(HttpResponseStatus.OK); String jsonCallback = request.getParameter("_jsonCallback"); boolean isJoin = request.getBooleanParameter("_wait", true); ResponseWriter resultWriter = getResponseWriter(writer, ServiceAction.DEFAULT_ROOT_ELEMENT, true, jsonCallback, false, false); Job job = createJob(); job.setArgs(request.getParameterMap()); long startTime = System.nanoTime(); ResultFuture resultFuture = JobService.getInstance().offer(job); Object result = null; int status = 0; resultWriter.object(); if(isJoin){ result = resultFuture.take(); if(resultFuture.isSuccess()){ resultWriter.key("result"); writeResult(resultWriter, result); resultWriter.key("error").value(""); }else{ resultWriter.key("error"); writeError(resultWriter, result); resultWriter.key("result").value(""); status = 1; } }else{ resultWriter.key("result").value(""); resultWriter.key("error").value(""); } int time = (int) ((System.nanoTime() - startTime) / 1000000L); resultWriter.key("time").value(time); resultWriter.key("status").value(status); resultWriter.endObject(); resultWriter.done(); writer.close(); } protected abstract Job createJob(); protected abstract void writeResult(ResponseWriter resultWriter, Object result) throws Exception; protected void writeError(ResponseWriter resultWriter, Object e) throws ResultWriterException { logger.error(">> error > {}", e.toString()); resultWriter.value(e.toString()); } }