package org.fastcatsearch.job.cluster; import java.io.IOException; import java.util.HashMap; import java.util.Map; 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.MasterNodeJob; import org.fastcatsearch.job.state.TaskKey; import org.fastcatsearch.job.state.TaskState; import org.fastcatsearch.job.state.TaskStateService; import org.fastcatsearch.service.ServiceManager; import org.fastcatsearch.util.DynamicClassLoader; /** * 원격 노드에서 master노드로 실행중인 task의 정보를 업데이트 한다. * */ public class UpdateNodeTaskStateJob extends MasterNodeJob implements Streamable { private static final long serialVersionUID = -5476946471506917337L; private String originNodeId; private Map<TaskKey, TaskState> runningTaskMap; public UpdateNodeTaskStateJob() { } public UpdateNodeTaskStateJob(String originNodeId) { this.originNodeId = originNodeId; } public void setRunningTaskMap(Map<TaskKey, TaskState> runningTaskMap) { this.runningTaskMap = runningTaskMap; } @Override public JobResult doRun() throws FastcatSearchException { TaskStateService taskStateService = ServiceManager.getInstance().getService(TaskStateService.class); if (runningTaskMap != null && runningTaskMap.size() > 0) { taskStateService.putAllTasks(originNodeId, runningTaskMap); } return new JobResult(true); } @Override public void readFrom(DataInput input) throws IOException { this.originNodeId = input.readString(); int size = input.readVInt(); if (size > 0) { runningTaskMap = new HashMap<TaskKey, TaskState>(size); for (int i = 0; i < size; i++) { String taskKeyClass = input.readString(); TaskKey taskKey = (TaskKey) DynamicClassLoader.loadObject(taskKeyClass); taskKey.readFrom(input); String taskStateClass = input.readString(); TaskState taskState = (TaskState) DynamicClassLoader.loadObject(taskStateClass); taskState.readFrom(input); runningTaskMap.put(taskKey, taskState); } } } @Override public void writeTo(DataOutput output) throws IOException { output.writeString(originNodeId); if (runningTaskMap != null && runningTaskMap.size() > 0) { output.writeVInt(runningTaskMap.size()); for (Map.Entry<TaskKey, TaskState> entry : runningTaskMap.entrySet()) { output.writeString(entry.getKey().getClass().getName()); entry.getKey().writeTo(output); output.writeString(entry.getValue().getClass().getName()); entry.getValue().writeTo(output); } } else { output.writeVInt(0); } } }