From 215a85c786bcbfdf4f57fb3c8917fd1706d3e92a Mon Sep 17 00:00:00 2001 From: Björn Geiger Date: Wed, 27 Jul 2011 12:57:56 +0200 Subject: Shutdown hinzugefügt --- .../ControllerWorker/Shutdown.java | 183 +++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 gearman/controllerWorker/ControllerWorker/Shutdown.java (limited to 'gearman/controllerWorker/ControllerWorker/Shutdown.java') diff --git a/gearman/controllerWorker/ControllerWorker/Shutdown.java b/gearman/controllerWorker/ControllerWorker/Shutdown.java new file mode 100644 index 0000000..6cb8645 --- /dev/null +++ b/gearman/controllerWorker/ControllerWorker/Shutdown.java @@ -0,0 +1,183 @@ +package ControllerWorker; + +import java.io.IOException; +import java.lang.Thread; +import java.util.concurrent.ExecutionException; +import java.util.HashMap; +import java.util.Vector; + +import org.gearman.client.GearmanClient; +import org.gearman.client.GearmanClientImpl; +import org.gearman.client.GearmanJob; +import org.gearman.client.GearmanJobImpl; +import org.gearman.client.GearmanJobResult; +import org.gearman.client.GearmanJobStatus; +import org.gearman.common.GearmanJobServerConnection; +import org.gearman.common.GearmanNIOJobServerConnection; +import org.gearman.util.ByteUtils; + +import org.json.simple.JSONObject; +import org.json.simple.JSONValue; + +public class Shutdown extends Thread { + private long beginTime; + private long timeTaken; + private long timeLeft; + private Boolean finished; + private Boolean error; + private final int updateRate; + private final long updatePeriod; + + private HashMap pingJobs; + private HashMap wolJobs; + private HashMap sshJobs; + private HashMap status; + private HashMap errors; + + private Vector> clients; + + private final GearmanJobServerConnection gearmanConnection; + private GearmanClient gearmanClient; + + public Shutdown(String serverAddress, int port, + Vector> clients, int updateRate) { + this.pingJobs = new HashMap(); + this.wolJobs = new HashMap(); + this.sshJobs = new HashMap(); + this.status = new HashMap(); + this.errors = new HashMap(); + this.updateRate = updateRate; // updates per second + this.updatePeriod = 1000000000L / this.updateRate; // nanoseconds + this.gearmanConnection = new GearmanNIOJobServerConnection( + serverAddress, port); + this.gearmanClient = new GearmanClientImpl(); + gearmanClient.addJobServer(this.gearmanConnection); + this.clients = clients; + for (HashMap client : clients) { + int clientID = Integer.parseInt(client.get("id")); + status.put(clientID, 0); // no work + } + this.finished = false; + this.error = false; + } + + public void run() { + workerLoop(); + } + + private void workerLoop() { + Boolean run = true; + while (run) { + try { + beginTime = System.nanoTime(); + run = update(); + timeTaken = System.nanoTime() - beginTime; + timeLeft = (updatePeriod - timeTaken) / 1000000; + if (timeLeft < 10) + timeLeft = 10; + Thread.sleep(timeLeft); + } catch (Exception e) { + e.printStackTrace(); + } + } + this.finished = true; + System.out.println("Booting finished"); + } + + private Boolean update() throws IllegalStateException, IOException, + InterruptedException, ExecutionException { + Boolean allFinished = false; + + for (HashMap client : clients) { + String ipAddress = client.get("ip"); + String macAddress = client.get("mac"); + int clientID = Integer.parseInt(client.get("id")); + int clientStatus = status.get(clientID); + + switch (clientStatus) { + } + if (clientStatus == 20) { + allFinished = true; + } else if (clientStatus == 19) { + allFinished = true; + this.error = true; + } else { + allFinished = false; + } + } + + if (allFinished) { + return false; + } else { + return true; + } + } + + private void ping(HashMap client) { + String ipAddress = client.get("ip"); + int clientID = Integer.parseInt(client.get("id")); + + GearmanJob job = GearmanJobImpl.createJob("ping", ipAddress.getBytes(), + "ping" + clientID); + gearmanClient.submit(job); + + status.put(clientID, 1); // ping started + pingJobs.put(clientID, job); + + System.out.println("ping " + ipAddress); + } + + private void ssh(HashMap client) { + String ipAddress = client.get("ip"); + int clientID = Integer.parseInt(client.get("id")); + + GearmanJob job = GearmanJobImpl.createJob("ssh", ipAddress.getBytes(), + "ssh" + clientID); + gearmanClient.submit(job); + + status.put(clientID, 6); // ssh started + sshJobs.put(clientID, job); + + System.out.println("ssh " + ipAddress); + } + + public Vector> getClients() { + return clients; + } + + public GearmanClient getGearmanClient() { + return gearmanClient; + } + + public GearmanJobServerConnection getGearmanConnection() { + return gearmanConnection; + } + + public HashMap getPingJobs() { + return pingJobs; + } + + public HashMap getWolJobs() { + return wolJobs; + } + + public HashMap getSshJobs() { + return sshJobs; + } + + public HashMap getStatus() { + return status; + } + + public HashMap getErrors() { + return errors; + } + + public Boolean isFinished() { + return finished; + } + + public Boolean isFinishedWithErrors() { + return finished && error; + } +} \ No newline at end of file -- cgit v1.2.3-55-g7522