package com.github.martinprillard.shavadoop.slave.tasktracker; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import com.github.martinprillard.shavadoop.slave.Slave; import com.github.martinprillard.shavadoop.util.Constant; /** * * @author martin prillard * */ public class StateSlave extends Thread { private int portTaskTracker; private String hostMaster; private boolean run = true; private Slave slave; public StateSlave(Slave _slave, String _hostMaster, int _portTaskTracker) { slave = _slave; portTaskTracker = _portTaskTracker; hostMaster = _hostMaster; } private void stopStateSlave() { run = false; } public void run() { Socket socket = null; try { socket = new Socket(hostMaster, portTaskTracker); while (run) { waitRequestMaster(socket); } } catch (Exception e) { e.printStackTrace(); } finally { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * Wait the request state'slave from the task tracker * * @param socket */ public void waitRequestMaster(Socket socket) { // get the return message from the server BufferedReader in = null; try { in = new BufferedReader(new InputStreamReader(socket.getInputStream())); // get the request from the task tracker String request = in.readLine(); if (request.equalsIgnoreCase(Constant.MESSAGE_TASKTRACKER_REQUEST)) { // if the task is already finished if (slave.isTaskFinished()) { sendTaskFinished(socket); } else { // send the slave state sendState(socket, slave.isState()); } } } catch (Exception e) { e.printStackTrace(); } } /** * Send if the worker is working or not * * @param state */ public void sendState(Socket socket, boolean state) { // request slave state PrintWriter out = null; try { out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); // send state String stateString = null; if (state) { stateString = Constant.ANSWER_TASKTRACKER_REQUEST_OK; out.println(stateString); out.flush(); } else { stateString = slave.getMsgError(); out.println(stateString); out.flush(); stopStateSlave(); } } catch (IOException e) { e.printStackTrace(); } } /** * Send if the worker's task is finished * * @param socket */ public void sendTaskFinished(Socket socket) { // request slave state PrintWriter out = null; try { out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); out.println(Constant.ANSWER_TASKTRACKER_REQUEST_TASK_FINISHED); out.flush(); stopStateSlave(); } catch (IOException e) { e.printStackTrace(); } } }