From 24025bbcd2b3d27b3faaee838be7d65e69189451 Mon Sep 17 00:00:00 2001 From: Björn Geiger Date: Wed, 21 Sep 2011 14:28:54 +0200 Subject: StatusWorker überarbeitet, noch nicht getestet --- .../controllerWorker/ControllerWorker/Boot.java | 112 ++++--- .../ControllerWorker/BootState.java | 65 ++++ .../ControllerWorker/BootWorker.java | 40 ++- .../controllerWorker/ControllerWorker/Client.java | 36 ++- .../ControllerWorker/Shutdown.java | 71 +++-- .../ControllerWorker/ShutdownState.java | 59 ++++ .../ControllerWorker/ShutdownWorker.java | 39 ++- .../ControllerWorker/StatusWorker.java | 335 +++++++++++++++------ 8 files changed, 586 insertions(+), 171 deletions(-) create mode 100644 gearman/controllerWorker/ControllerWorker/BootState.java create mode 100644 gearman/controllerWorker/ControllerWorker/ShutdownState.java (limited to 'gearman/controllerWorker') diff --git a/gearman/controllerWorker/ControllerWorker/Boot.java b/gearman/controllerWorker/ControllerWorker/Boot.java index 6a71890..17a017f 100755 --- a/gearman/controllerWorker/ControllerWorker/Boot.java +++ b/gearman/controllerWorker/ControllerWorker/Boot.java @@ -3,6 +3,7 @@ package ControllerWorker; import java.io.IOException; import java.lang.Thread; import java.util.Date; +import java.util.LinkedHashMap; import java.util.StringTokenizer; import java.util.Vector; @@ -81,11 +82,20 @@ public class Boot extends Thread { } } finished = true; + LinkedHashMap jsonData = new LinkedHashMap(); + jsonData.put("eventName", eventName); + jsonData.put("type", "finishBootState"); if (error) { logger.error("Booting of " + eventName + " failed"); + jsonData.put("error", true); } else { logger.info("Booting of " + eventName + " finished"); + jsonData.put("error", false); } + String dataString = JSONValue.toJSONString(jsonData); + GearmanJob job = GearmanJobImpl.createJob("status", dataString + .getBytes(), "status" + eventName); + gearmanClient.submit(job); } /* @@ -199,7 +209,8 @@ public class Boot extends Thread { logger.error(client.getIp() + " User has been working"); client.setError("The user has been working."); // user has been working, go in errorState - client.setState(ClientState.BOOT_ERROR); + client.setState(ClientState.BOOT_ERROR, gearmanClient); + break; case CLIENT_IS_DOWN: @@ -264,7 +275,7 @@ public class Boot extends Thread { GearmanJob job = GearmanJobImpl.createJob("ping", client.getIp() .getBytes(), "ping" + client.getId()); gearmanClient.submit(job); - client.setState(ClientState.CHECK_PING_PROGRESS); + client.setState(ClientState.CHECK_PING_PROGRESS, gearmanClient); client.addJob(ClientJob.PINGJOB, job); logger.info("ping " + client.getIp()); } @@ -284,11 +295,13 @@ public class Boot extends Thread { String alive = resultObj.get("alive").toString(); if (alive.equals("true")) { logger.info(client.getIp() + " alive"); - client.setState(ClientState.CLIENT_IS_ALIVE); + client.setState(ClientState.CLIENT_IS_ALIVE, + gearmanClient); client.removeJob(pingJob); } else if (alive.equals("false")) { logger.info(client.getIp() + " not alive"); - client.setState(ClientState.CLIENT_NOT_ALIVE); + client.setState(ClientState.CLIENT_NOT_ALIVE, + gearmanClient); client.removeJob(pingJob); } } else { @@ -296,7 +309,7 @@ public class Boot extends Thread { + " Cannot send the ping message."); client .setError("Sending the ping message has been failed."); - client.setState(ClientState.BOOT_ERROR); + client.setState(ClientState.BOOT_ERROR, gearmanClient); client.removeJob(pingJob); } } @@ -308,7 +321,7 @@ public class Boot extends Thread { GearmanJob job = GearmanJobImpl.createJob("ping", client.getIp() .getBytes(), "ping" + client.getId()); gearmanClient.submit(job); - client.setState(ClientState.CHECK_PING_WOL_PROGRESS); + client.setState(ClientState.CHECK_PING_WOL_PROGRESS, gearmanClient); client.addJob(ClientJob.PINGJOB, job); logger.info("ping " + client.getIp()); } @@ -339,11 +352,13 @@ public class Boot extends Thread { logger.info(client.getIp() + " is alive after WoL"); // alive, go in successState - client.setState(ClientState.BOOT_SUCCESS); + client.setState(ClientState.BOOT_SUCCESS, + gearmanClient); client.removeJob(pingJobWoL); } else if (alive.equals("false")) { logger.info("ping again " + client.getIp()); - client.setState(ClientState.PING_WOL_AGAIN); + client.setState(ClientState.PING_WOL_AGAIN, + gearmanClient); client.removeJob(pingJobWoL); } } else { @@ -356,7 +371,8 @@ public class Boot extends Thread { * sending the ping after wake on LAN message has * been failed, go to errorState */ - client.setState(ClientState.BOOT_ERROR); + client.setState(ClientState.BOOT_ERROR, + gearmanClient); client.removeJob(pingJobWoL); } } @@ -365,7 +381,7 @@ public class Boot extends Thread { logger.error(client.getIp() + " is not alive after WoL"); client.setError("The wake on LAN has been failed."); // not alive, go in errorState - client.setState(ClientState.BOOT_ERROR); + client.setState(ClientState.BOOT_ERROR, gearmanClient); client.removeJob(pingJobWoL); } } @@ -375,7 +391,8 @@ public class Boot extends Thread { GearmanJob job = GearmanJobImpl.createJob("ping", client.getIp() .getBytes(), "ping" + client.getId()); gearmanClient.submit(job); - client.setState(ClientState.CHECK_PING_RESTART_SHUTDOWN_PROGRESS); + client.setState(ClientState.CHECK_PING_RESTART_SHUTDOWN_PROGRESS, + gearmanClient); client.addJob(ClientJob.PINGJOB, job); logger.info("ping " + client.getIp()); } @@ -407,12 +424,15 @@ public class Boot extends Thread { logger.info(client.getIp() + " is still alive"); // still alive, ping again client - .setState(ClientState.PING_RESTART_SHUTDOWN_AGAIN); + .setState( + ClientState.PING_RESTART_SHUTDOWN_AGAIN, + gearmanClient); client.removeJob(pingJobRestartShutdown); } else if (alive.equals("false")) { logger.info(client.getIp() + " is down"); // not alive, ping again - client.setState(ClientState.CLIENT_IS_DOWN); + client.setState(ClientState.CLIENT_IS_DOWN, + gearmanClient); client.removeJob(pingJobRestartShutdown); } } else { @@ -425,7 +445,8 @@ public class Boot extends Thread { * sending the ping after restart message has been * failed */ - client.setState(ClientState.BOOT_ERROR); + client.setState(ClientState.BOOT_ERROR, + gearmanClient); client.removeJob(pingJobRestartShutdown); } } @@ -434,7 +455,7 @@ public class Boot extends Thread { logger.error(client.getIp() + " shutdown failed"); client.setError("The shutdown has been failed."); // still alive, go in errorState - client.setState(ClientState.BOOT_ERROR); + client.setState(ClientState.BOOT_ERROR, gearmanClient); client.removeJob(pingJobRestartShutdown); } } @@ -444,7 +465,8 @@ public class Boot extends Thread { GearmanJob job = GearmanJobImpl.createJob("ping", client.getIp() .getBytes(), "ping" + client.getId()); gearmanClient.submit(job); - client.setState(ClientState.CHECK_PING_RESTART_BOOT_PROGRESS); + client.setState(ClientState.CHECK_PING_RESTART_BOOT_PROGRESS, + gearmanClient); client.addJob(ClientJob.PINGJOB, job); logger.info("ping " + client.getIp()); } @@ -477,13 +499,15 @@ public class Boot extends Thread { logger.info(client.getIp() + " is alive after restart"); // alive, go to success state - client.setState(ClientState.BOOT_SUCCESS); + client.setState(ClientState.BOOT_SUCCESS, + gearmanClient); client.removeJob(pingJobRestartBoot); } else if (alive.equals("false")) { logger.info("ping again " + client.getIp()); // not alive, ping again - client - .setState(ClientState.PING_RESTART_BOOT_AGAIN); + client.setState( + ClientState.PING_RESTART_BOOT_AGAIN, + gearmanClient); client.removeJob(pingJobRestartBoot); } } else { @@ -496,7 +520,8 @@ public class Boot extends Thread { * sending the ping after shutdown message has been * failed */ - client.setState(ClientState.BOOT_ERROR); + client.setState(ClientState.BOOT_ERROR, + gearmanClient); } } } @@ -504,7 +529,7 @@ public class Boot extends Thread { logger.error(client.getIp() + " is not alive after reboot"); client.setError("The reboot has been failed."); // not alive, go in errorState - client.setState(ClientState.BOOT_ERROR); + client.setState(ClientState.BOOT_ERROR, gearmanClient); client.removeJob(pingJobRestartBoot); } } @@ -514,7 +539,7 @@ public class Boot extends Thread { GearmanJob job = GearmanJobImpl.createJob("wol", client.getMac() .getBytes(), "wol" + client.getId()); gearmanClient.submit(job); - client.setState(ClientState.CHECK_WAKE_ON_LAN_PROGRESS); + client.setState(ClientState.CHECK_WAKE_ON_LAN_PROGRESS, gearmanClient); client.addJob(ClientJob.WOLJOB, job); logger.info("wake on lan " + client.getMac()); } @@ -531,14 +556,15 @@ public class Boot extends Thread { String result = ByteUtils.fromUTF8Bytes(wolJobRes.getResults()); if (result.equals("Magic packet send.")) { logger.info(client.getMac() + " Magic packet sent."); - client.setState(ClientState.MAGIC_PACKET_SENT); + client.setState(ClientState.MAGIC_PACKET_SENT, + gearmanClient); client.removeJob(wolJob); } else { logger.error(client.getIp() + " Cannot send magic packet."); client .setError("Sending the magic packet has been failed."); // cannot send magic packet, go in errorState - client.setState(ClientState.BOOT_ERROR); + client.setState(ClientState.BOOT_ERROR, gearmanClient); client.removeJob(wolJob); } } @@ -549,7 +575,7 @@ public class Boot extends Thread { GearmanJob job = GearmanJobImpl.createJob("os", client.getIp() .getBytes(), "os" + client.getId()); gearmanClient.submit(job); - client.setState(ClientState.CHECK_CHECKOS_PROGRESS); + client.setState(ClientState.CHECK_CHECKOS_PROGRESS, gearmanClient); client.addJob(ClientJob.OSJOB, job); logger.info("check OS " + client.getIp()); } @@ -579,11 +605,14 @@ public class Boot extends Thread { if (description.equals(bootOS)) { logger.info(client.getIp() + " right OS"); // right os, go to successState - client.setState(ClientState.BOOT_SUCCESS); + client.setState(ClientState.BOOT_SUCCESS, + gearmanClient); client.removeJob(osJob); } else { logger.info(client.getIp() + " wrong OS"); - client.setState(ClientState.WRONG_OS); + client + .setState(ClientState.WRONG_OS, + gearmanClient); client.removeJob(osJob); } } else { @@ -591,7 +620,7 @@ public class Boot extends Thread { client .setError("The check for correct operating system has been failed."); // cannot check os, go in errorState - client.setState(ClientState.BOOT_ERROR); + client.setState(ClientState.BOOT_ERROR, gearmanClient); client.removeJob(osJob); } } @@ -603,7 +632,7 @@ public class Boot extends Thread { GearmanJob job = GearmanJobImpl.createJob("who", client.getIp() .getBytes(), "who" + client.getId()); gearmanClient.submit(job); - client.setState(ClientState.CHECK_WHO_PROGRESS); + client.setState(ClientState.CHECK_WHO_PROGRESS, gearmanClient); client.addJob(ClientJob.WHOJOB, job); logger.info("who " + client.getIp()); } @@ -636,13 +665,15 @@ public class Boot extends Thread { // no user is logged in, doing restart // ----- // didn´t work in test-pool, check ps - client.setState(ClientState.A_USER_IS_LOGGED_IN); + client.setState(ClientState.A_USER_IS_LOGGED_IN, + gearmanClient); client.removeJob(whoJob); } else { logger .info(client.getIp() + " a user is logged in"); - client.setState(ClientState.A_USER_IS_LOGGED_IN); + client.setState(ClientState.A_USER_IS_LOGGED_IN, + gearmanClient); client.removeJob(whoJob); } } else { @@ -654,7 +685,7 @@ public class Boot extends Thread { * cannot check if a user is logged in, go in errorState */ // client - client.setState(ClientState.BOOT_ERROR); + client.setState(ClientState.BOOT_ERROR, gearmanClient); client.removeJob(whoJob); } } @@ -666,7 +697,7 @@ public class Boot extends Thread { GearmanJob job = GearmanJobImpl.createJob("ps", client.getIp() .getBytes(), "ps" + client.getId()); gearmanClient.submit(job); - client.setState(ClientState.CHECK_PS_PROGRESS); + client.setState(ClientState.CHECK_PS_PROGRESS, gearmanClient); client.addJob(ClientJob.PSJOB, job); logger.info("ps " + client.getIp()); } @@ -708,12 +739,14 @@ public class Boot extends Thread { * client.removeClientJob(job); } else { */ logger.info(client.getIp() + " is working"); - client.setState(ClientState.USER_IS_WORKING); + client.setState(ClientState.USER_IS_WORKING, + gearmanClient); client.removeJob(psJob); // } } else { // user is not working, doing restart - client.setState(ClientState.RESTART_CLIENT); + client.setState(ClientState.RESTART_CLIENT, + gearmanClient); client.removeJob(psJob); } } else { @@ -724,7 +757,7 @@ public class Boot extends Thread { /* * cannot check if user is working, go in errorState */ - client.setState(ClientState.BOOT_ERROR); + client.setState(ClientState.BOOT_ERROR, gearmanClient); client.removeJob(psJob); } } @@ -736,7 +769,7 @@ public class Boot extends Thread { GearmanJob job = GearmanJobImpl.createJob("restart", client.getIp() .getBytes(), "restart" + client.getId()); gearmanClient.submit(job); - client.setState(ClientState.CHECK_RESTART_PROGRESS); + client.setState(ClientState.CHECK_RESTART_PROGRESS, gearmanClient); client.addJob(ClientJob.RESTARTJOB, job); logger.info("restart " + client.getIp()); } @@ -755,7 +788,8 @@ public class Boot extends Thread { JSONObject resultObj = (JSONObject) JSONValue.parse(result); if (!resultObj.containsKey("err")) { logger.info(client.getIp() + " Restart command sent"); - client.setState(ClientState.RESTART_COMMAND_SENT); + client.setState(ClientState.RESTART_COMMAND_SENT, + gearmanClient); client.removeJob(restartJob); } else { logger.error(client.getIp() @@ -763,7 +797,7 @@ public class Boot extends Thread { client .setError("Sending the restart command has been failed."); // cannot send restart command, go in errorState - client.setState(ClientState.BOOT_ERROR); + client.setState(ClientState.BOOT_ERROR, gearmanClient); client.removeJob(restartJob); } } diff --git a/gearman/controllerWorker/ControllerWorker/BootState.java b/gearman/controllerWorker/ControllerWorker/BootState.java new file mode 100644 index 0000000..91c1f7a --- /dev/null +++ b/gearman/controllerWorker/ControllerWorker/BootState.java @@ -0,0 +1,65 @@ +package ControllerWorker; + +import java.util.Vector; + +public class BootState { + private String eventName; + private String bootOS; + private Vector clients; + private Boolean finished; + private Boolean error; + + public BootState(String eventName, Vector clients, String bootOS) { + this.eventName = eventName; + this.clients = clients; + this.bootOS = bootOS; + finished = false; + error = false; + } + + public Boolean isFinished() { + return finished && !error; + } + + public Boolean isFinishedWithErrors() { + return finished && error; + } + + public Vector getClients() { + return clients; + } + + public String getEventName() { + return eventName; + } + + public String getBootOS() { + return bootOS; + } + + public void finish() { + this.finished = true; + } + + public void error() { + this.error = true; + } + + public void setClientState(int clientID, ClientState newClientState) { + for (Client client : clients) { + if (client.getId() == clientID) { + client.setState(newClientState); + break; + } + } + } + + public void setClientError(int clientID, String error) { + for (Client client : clients) { + if (client.getId() == clientID) { + client.setError(error); + break; + } + } + } +} \ No newline at end of file diff --git a/gearman/controllerWorker/ControllerWorker/BootWorker.java b/gearman/controllerWorker/ControllerWorker/BootWorker.java index 0963aef..e9021e5 100755 --- a/gearman/controllerWorker/ControllerWorker/BootWorker.java +++ b/gearman/controllerWorker/ControllerWorker/BootWorker.java @@ -1,10 +1,17 @@ package ControllerWorker; +import java.util.LinkedHashMap; import java.util.StringTokenizer; 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.GearmanJobResultImpl; +import org.gearman.common.GearmanJobServerConnection; +import org.gearman.common.GearmanNIOJobServerConnection; import org.gearman.util.ByteUtils; import org.gearman.worker.AbstractGearmanFunction; @@ -29,23 +36,22 @@ public class BootWorker extends AbstractGearmanFunction { JSONObject jsonObject = (JSONObject) JSONValue.parse(data); String event = jsonObject.get("eventName").toString(); String eventOS = jsonObject.get("eventOS").toString(); - JSONArray jsonArray = (JSONArray) jsonObject.get("clients"); + JSONArray jsonClients = (JSONArray) jsonObject.get("clients"); - for (Object clientObj : jsonArray) { + for (Object clientObj : jsonClients) { JSONObject clientJsonObj = (JSONObject) clientObj; - Client client = new Client(clientJsonObj, - "The booting process of the client has been started."); + Client client = new Client(clientJsonObj, "boot", event); clients.add(client); } - String gearmanServerHost = ControllerWorkerMain.getApplication_ini().getString( - "gearman.server.host"); + String gearmanServerHost = ControllerWorkerMain.getApplication_ini() + .getString("gearman.server.host"); int gearmanServerPort = Integer.parseInt(ControllerWorkerMain .getApplication_ini().getString("gearman.server.port")); - long waitTime = Long.parseLong(ControllerWorkerMain.getApplication_ini() - .getString("gearman.worker.waitTime")); - int updateRate = Integer.parseInt(ControllerWorkerMain.getApplication_ini() - .getString("gearman.worker.updateRate")); + long waitTime = Long.parseLong(ControllerWorkerMain + .getApplication_ini().getString("gearman.worker.waitTime")); + int updateRate = Integer.parseInt(ControllerWorkerMain + .getApplication_ini().getString("gearman.worker.updateRate")); String blacklist = ControllerWorkerMain.getApplication_ini().getString( "gearman.worker.ps.blacklist"); StringTokenizer blacklistTokenizer = new StringTokenizer(blacklist, ","); @@ -65,7 +71,19 @@ public class BootWorker extends AbstractGearmanFunction { Boot boot = new Boot(event, clients, eventOS, updateRate, waitTime, psWhitelist, psBlacklist, gearmanServerHost, gearmanServerPort); - StatusWorker.BOOTTHREADS.put(event, boot); + GearmanJobServerConnection gearmanConnection = new GearmanNIOJobServerConnection( + gearmanServerHost, gearmanServerPort); + GearmanClient gearmanClient = new GearmanClientImpl(); + gearmanClient.addJobServer(gearmanConnection); + LinkedHashMap jsonData = new LinkedHashMap(); + jsonData.put("eventName", event); + jsonData.put("type", "createBootState"); + jsonData.put("eventOS", eventOS); + jsonData.put("clients", jsonClients.toArray()); + String dataString = JSONValue.toJSONString(jsonData); + GearmanJob job = GearmanJobImpl.createJob("status", dataString + .getBytes(), "status" + event); + gearmanClient.submit(job); boot.start(); logger.info("Booting of " + event + " started"); String res = "Booting started"; diff --git a/gearman/controllerWorker/ControllerWorker/Client.java b/gearman/controllerWorker/ControllerWorker/Client.java index 86d21b5..deb3246 100755 --- a/gearman/controllerWorker/ControllerWorker/Client.java +++ b/gearman/controllerWorker/ControllerWorker/Client.java @@ -1,27 +1,35 @@ package ControllerWorker; +import java.util.LinkedHashMap; import java.util.Vector; +import org.gearman.client.GearmanClient; import org.gearman.client.GearmanJob; +import org.gearman.client.GearmanJobImpl; import org.json.simple.JSONObject; +import org.json.simple.JSONValue; public class Client { private int id; private String ip; private String mac; private ClientState state; + private String type; + private String eventName; private Vector times; private Vector jobs; private String error; private Boolean finished; - public Client(JSONObject clientJsonObj, String initialStateText) { + public Client(JSONObject clientJsonObj, String type, String eventName) { + this.type = type; + this.eventName = eventName; id = Integer.parseInt(clientJsonObj.get("id").toString()); ip = clientJsonObj.get("ip").toString(); mac = clientJsonObj.get("mac").toString(); finished = false; error = ""; - setState(ClientState.CLIENT_UNKNOWN); + state = ClientState.CLIENT_UNKNOWN; times = new Vector(); jobs = new Vector(); } @@ -85,6 +93,11 @@ public class Client { return state; } + public void setState(ClientState state_, GearmanClient gearmanClient) { + state = state_; + publishStateChange(gearmanClient); + } + public void setState(ClientState state_) { state = state_; } @@ -107,4 +120,23 @@ public class Client { + id + ", ip=" + ip + ", jobs=" + jobs + ", mac=" + mac + ", state=" + state + ", times=" + times + "]"; } + + private void publishStateChange(GearmanClient gearmanClient) { + LinkedHashMap jsonData = new LinkedHashMap(); + if (type.equals("boot")) { + jsonData.put("type", "updateClientStateBoot"); + } else if (type.equals("shutdown")) { + jsonData.put("type", "updateClientStateShutdown"); + } else { + return; + } + jsonData.put("eventName", eventName); + jsonData.put("clientID", id); + jsonData.put("error", error); + jsonData.put("newState", state.toString()); + String dataString = JSONValue.toJSONString(jsonData); + GearmanJob job = GearmanJobImpl.createJob("status", dataString + .getBytes(), "status" + eventName); + gearmanClient.submit(job); + } } \ No newline at end of file diff --git a/gearman/controllerWorker/ControllerWorker/Shutdown.java b/gearman/controllerWorker/ControllerWorker/Shutdown.java index b0c869e..9920acc 100755 --- a/gearman/controllerWorker/ControllerWorker/Shutdown.java +++ b/gearman/controllerWorker/ControllerWorker/Shutdown.java @@ -3,6 +3,7 @@ package ControllerWorker; import java.io.IOException; import java.lang.Thread; import java.util.Date; +import java.util.LinkedHashMap; import java.util.StringTokenizer; import java.util.Vector; @@ -79,11 +80,20 @@ public class Shutdown extends Thread { } } finished = true; + LinkedHashMap jsonData = new LinkedHashMap(); + jsonData.put("eventName", eventName); + jsonData.put("type", "finishShutdownState"); if (error) { logger.error("Shutdown of " + eventName + " failed"); + jsonData.put("error", true); } else { logger.info("Shutdown of " + eventName + " finished"); + jsonData.put("error", false); } + String dataString = JSONValue.toJSONString(jsonData); + GearmanJob job = GearmanJobImpl.createJob("status", dataString + .getBytes(), "status" + eventName); + gearmanClient.submit(job); } /* @@ -155,7 +165,7 @@ public class Shutdown extends Thread { case USER_IS_WORKING: logger.error(client.getIp() + " User has been working"); client.setError("The user has been working."); - client.setState(ClientState.SHUTDOWN_ERROR); + client.setState(ClientState.SHUTDOWN_ERROR, gearmanClient); break; case SHUTDOWN_ERROR: @@ -203,7 +213,7 @@ public class Shutdown extends Thread { GearmanJob job = GearmanJobImpl.createJob("ping", client.getIp() .getBytes(), "ping" + client.getId()); gearmanClient.submit(job); - client.setState(ClientState.CHECK_PING_PROGRESS); + client.setState(ClientState.CHECK_PING_PROGRESS, gearmanClient); client.addJob(ClientJob.PINGJOB, job); logger.info("ping " + client.getIp()); } @@ -226,14 +236,16 @@ public class Shutdown extends Thread { if (alive.equals("true")) { logger.info(client.getIp() + " alive"); - client.setState(ClientState.CLIENT_IS_ALIVE); + client.setState(ClientState.CLIENT_IS_ALIVE, + gearmanClient); // check // Users client.removeJob(pingJob); } else if (alive.equals("false")) { logger.info(client.getIp() + " not alive"); // not alive, go in successState - client.setState(ClientState.SHUTDOWN_SUCCESS); + client.setState(ClientState.SHUTDOWN_SUCCESS, + gearmanClient); client.removeJob(pingJob); } } else { @@ -242,7 +254,8 @@ public class Shutdown extends Thread { client .setError("Sending the ping message has been failed."); // sending the ping message has been failed - client.setState(ClientState.SHUTDOWN_ERROR); + client.setState(ClientState.SHUTDOWN_ERROR, + gearmanClient); client.removeJob(pingJob); } } @@ -254,7 +267,7 @@ public class Shutdown extends Thread { GearmanJob job = GearmanJobImpl.createJob("who", client.getIp() .getBytes(), "who" + client.getId()); gearmanClient.submit(job); - client.setState(ClientState.CHECK_WHO_PROGRESS); + client.setState(ClientState.CHECK_WHO_PROGRESS, gearmanClient); client.addJob(ClientJob.WHOJOB, job); logger.info("who " + client.getIp()); } @@ -287,14 +300,16 @@ public class Shutdown extends Thread { // no user is logged in // ----- // didn´t work in test-pool, check ps - client.setState(ClientState.USER_IS_LOGGED_IN); + client.setState(ClientState.USER_IS_LOGGED_IN, + gearmanClient); client.removeJob(whoJob); } else { logger .info(client.getIp() + " a user is logged in"); // a user is logged in - client.setState(ClientState.USER_IS_LOGGED_IN); + client.setState(ClientState.USER_IS_LOGGED_IN, + gearmanClient); client.removeJob(whoJob); } } else { @@ -305,7 +320,8 @@ public class Shutdown extends Thread { /* * cannot check if a user is logged in, go in errorState */ - client.setState(ClientState.SHUTDOWN_ERROR); + client.setState(ClientState.SHUTDOWN_ERROR, + gearmanClient); client.removeJob(whoJob); } } @@ -318,7 +334,7 @@ public class Shutdown extends Thread { .getBytes(), "doShutdown" + client.getId()); gearmanClient.submit(job); - client.setState(ClientState.CHECK_SHUTDOWN_PROGRESS); + client.setState(ClientState.CHECK_SHUTDOWN_PROGRESS, gearmanClient); client.addJob(ClientJob.SHUTDOWNJOB, job); logger.info("doShutdown " + client.getIp()); } @@ -338,7 +354,8 @@ public class Shutdown extends Thread { JSONObject resultObj = (JSONObject) JSONValue.parse(result); if (!resultObj.containsKey("err")) { logger.info(client.getIp() + " Shutdown command sent"); - client.setState(ClientState.SHUTDOWN_COMMAND_SENT); + client.setState(ClientState.SHUTDOWN_COMMAND_SENT, + gearmanClient); client.removeJob(doShutdownJob); } else { logger.error(client.getIp() @@ -346,7 +363,8 @@ public class Shutdown extends Thread { client .setError("Sending the shutdown command has been failed."); // cannot send shutdown command, go in / errorState - client.setState(ClientState.SHUTDOWN_ERROR); + client.setState(ClientState.SHUTDOWN_ERROR, + gearmanClient); client.removeJob(doShutdownJob); } } @@ -358,7 +376,9 @@ public class Shutdown extends Thread { GearmanJob job = GearmanJobImpl.createJob("ping", client.getIp() .getBytes(), "ping" + client.getId()); gearmanClient.submit(job); - client.setState(ClientState.CHECK_PING_SHUTDOWN_PROGRESS); + client + .setState(ClientState.CHECK_PING_SHUTDOWN_PROGRESS, + gearmanClient); client.addJob(ClientJob.PINGJOB, job); logger.info("ping " + client.getIp()); } @@ -389,14 +409,16 @@ public class Shutdown extends Thread { if (alive.equals("false")) { logger.info(client.getIp() + " is not alive anymore"); - client.setState(ClientState.SHUTDOWN_SUCCESS); + client.setState(ClientState.SHUTDOWN_SUCCESS, + gearmanClient); client.removeJob(pingJobShutdown); } else if (alive.equals("true")) { logger .info(client.getIp() + " is still alive after shutdown command"); - client - .setState(ClientState.PING_SHUTDOWN_AGAIN); + client.setState( + ClientState.PING_SHUTDOWN_AGAIN, + gearmanClient); } } else { logger @@ -408,7 +430,8 @@ public class Shutdown extends Thread { * sending the ping after shutdown message has been * failed */ - client.setState(ClientState.SHUTDOWN_ERROR); + client.setState(ClientState.SHUTDOWN_ERROR, + gearmanClient); client.removeJob(pingJobShutdown); } } @@ -417,7 +440,7 @@ public class Shutdown extends Thread { logger.error(client.getIp() + " is alive after shutdown"); client.setError("Client is still alive after shutdown."); // still alive, go in errorState - client.setState(ClientState.SHUTDOWN_ERROR); + client.setState(ClientState.SHUTDOWN_ERROR, gearmanClient); client.removeJob(pingJobShutdown); } } @@ -427,7 +450,7 @@ public class Shutdown extends Thread { GearmanJob job = GearmanJobImpl.createJob("ps", client.getIp() .getBytes(), "ps" + client.getId()); gearmanClient.submit(job); - client.setState(ClientState.CHECK_PS_PROGRESS); + client.setState(ClientState.CHECK_PS_PROGRESS, gearmanClient); client.addJob(ClientJob.PSJOB, job); logger.info("ps " + client.getIp()); } @@ -470,13 +493,15 @@ public class Shutdown extends Thread { * * } else { */ - client.setState(ClientState.USER_IS_WORKING); + client.setState(ClientState.USER_IS_WORKING, + gearmanClient); client.removeJob(psJob); // } } else { logger.info(client.getIp() + " is not working"); // is not working - client.setState(ClientState.SHUTDOWN_CLIENT); + client.setState(ClientState.SHUTDOWN_CLIENT, + gearmanClient); client.removeJob(psJob); } } else { @@ -487,7 +512,8 @@ public class Shutdown extends Thread { /* * cannot check if user is working, go in errorState */ - client.setState(ClientState.SHUTDOWN_ERROR); + client.setState(ClientState.SHUTDOWN_ERROR, + gearmanClient); client.removeJob(psJob); } } @@ -510,5 +536,4 @@ public class Shutdown extends Thread { public String getEventName() { return eventName; } - } \ No newline at end of file diff --git a/gearman/controllerWorker/ControllerWorker/ShutdownState.java b/gearman/controllerWorker/ControllerWorker/ShutdownState.java new file mode 100644 index 0000000..cf3aa8e --- /dev/null +++ b/gearman/controllerWorker/ControllerWorker/ShutdownState.java @@ -0,0 +1,59 @@ +package ControllerWorker; + +import java.util.Vector; + +public class ShutdownState { + private String eventName; + private Vector clients; + private Boolean finished; + private Boolean error; + + public ShutdownState(String eventName, Vector clients) { + this.eventName = eventName; + this.clients = clients; + finished = false; + error = false; + } + + public Boolean isFinished() { + return finished && !error; + } + + public Boolean isFinishedWithErrors() { + return finished && error; + } + + public Vector getClients() { + return clients; + } + + public String getEventName() { + return eventName; + } + + public void finish() { + this.finished = true; + } + + public void error() { + this.error = true; + } + + public void setClientState(int clientID, ClientState newClientState) { + for (Client client : clients) { + if (client.getId() == clientID) { + client.setState(newClientState); + break; + } + } + } + + public void setClientError(int clientID, String error) { + for (Client client : clients) { + if (client.getId() == clientID) { + client.setError(error); + break; + } + } + } +} \ No newline at end of file diff --git a/gearman/controllerWorker/ControllerWorker/ShutdownWorker.java b/gearman/controllerWorker/ControllerWorker/ShutdownWorker.java index 4057d9f..654c07f 100755 --- a/gearman/controllerWorker/ControllerWorker/ShutdownWorker.java +++ b/gearman/controllerWorker/ControllerWorker/ShutdownWorker.java @@ -1,10 +1,17 @@ package ControllerWorker; +import java.util.LinkedHashMap; import java.util.StringTokenizer; 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.GearmanJobResultImpl; +import org.gearman.common.GearmanJobServerConnection; +import org.gearman.common.GearmanNIOJobServerConnection; import org.gearman.util.ByteUtils; import org.gearman.worker.AbstractGearmanFunction; @@ -28,23 +35,22 @@ public class ShutdownWorker extends AbstractGearmanFunction { Vector clients = new Vector(); JSONObject jsonObject = (JSONObject) JSONValue.parse(data); String event = jsonObject.get("eventName").toString(); - JSONArray jsonArray = (JSONArray) jsonObject.get("clients"); + JSONArray jsonClients = (JSONArray) jsonObject.get("clients"); - for (Object clientObj : jsonArray) { + for (Object clientObj : jsonClients) { JSONObject clientJsonObj = (JSONObject) clientObj; - Client client = new Client(clientJsonObj, - "The shutdown process of the client has been started."); + Client client = new Client(clientJsonObj, "shutdown", event); clients.add(client); } - String gearmanServerHost = ControllerWorkerMain.getApplication_ini().getString( - "gearman.server.host"); + String gearmanServerHost = ControllerWorkerMain.getApplication_ini() + .getString("gearman.server.host"); int gearmanServerPort = Integer.parseInt(ControllerWorkerMain .getApplication_ini().getString("gearman.server.port")); - long waitTime = Long.parseLong(ControllerWorkerMain.getApplication_ini() - .getString("gearman.worker.waitTime")); - int updateRate = Integer.parseInt(ControllerWorkerMain.getApplication_ini() - .getString("gearman.worker.updateRate")); + long waitTime = Long.parseLong(ControllerWorkerMain + .getApplication_ini().getString("gearman.worker.waitTime")); + int updateRate = Integer.parseInt(ControllerWorkerMain + .getApplication_ini().getString("gearman.worker.updateRate")); String blacklist = ControllerWorkerMain.getApplication_ini().getString( "gearman.worker.ps.blacklist"); StringTokenizer blacklistTokenizer = new StringTokenizer(blacklist, ","); @@ -64,7 +70,18 @@ public class ShutdownWorker extends AbstractGearmanFunction { Shutdown shutdown = new Shutdown(event, clients, updateRate, waitTime, psWhitelist, psBlacklist, gearmanServerHost, gearmanServerPort); - StatusWorker.SHUTDOWNTHREADS.put(event, shutdown); + GearmanJobServerConnection gearmanConnection = new GearmanNIOJobServerConnection( + gearmanServerHost, gearmanServerPort); + GearmanClient gearmanClient = new GearmanClientImpl(); + gearmanClient.addJobServer(gearmanConnection); + LinkedHashMap jsonData = new LinkedHashMap(); + jsonData.put("eventName", event); + jsonData.put("type", "createShutdownState"); + jsonData.put("clients", jsonClients.toArray()); + String dataString = JSONValue.toJSONString(jsonData); + GearmanJob job = GearmanJobImpl.createJob("status", dataString + .getBytes(), "status" + event); + gearmanClient.submit(job); shutdown.start(); logger.info("Shutdown of " + event + " started"); String res = "Shutdown started"; diff --git a/gearman/controllerWorker/ControllerWorker/StatusWorker.java b/gearman/controllerWorker/ControllerWorker/StatusWorker.java index 1743a2d..75bca69 100755 --- a/gearman/controllerWorker/ControllerWorker/StatusWorker.java +++ b/gearman/controllerWorker/ControllerWorker/StatusWorker.java @@ -17,8 +17,8 @@ import org.json.simple.JSONValue; public class StatusWorker extends AbstractGearmanFunction { // private static final Logger logger = ControllerWorkerMain.getLogger(); - static HashMap BOOTTHREADS = new HashMap(); - static HashMap SHUTDOWNTHREADS = new HashMap(); + private HashMap BOOTSTATES = new HashMap(); + private HashMap SHUTDOWNSTATES = new HashMap(); @Override public String getName() { @@ -28,9 +28,31 @@ public class StatusWorker extends AbstractGearmanFunction { @Override public GearmanJobResult executeFunction() { String data = ByteUtils.fromUTF8Bytes((byte[]) this.data); - Vector events = new Vector(); JSONObject jsonObject = (JSONObject) JSONValue.parse(data); String type = jsonObject.get("type").toString(); + if (type == "getBootState") { + return getBootState(jsonObject); + } else if (type == "getShutdownState") { + return getShutdownState(jsonObject); + } else if (type == "updateClientStateBoot") { + return updateClientStateBoot(jsonObject); + } else if (type == "updateClientStateShutdown") { + return updateClientStateShutdown(jsonObject); + } else if (type == "createBootState") { + return createBootState(jsonObject); + } else if (type == "createShutdownState") { + return createShutdownState(jsonObject); + } else if (type == "finishBootState") { + return finishBootState(jsonObject); + } else if (type == "finishShutdownState") { + return finishShutdownState(jsonObject); + } else { + return null; + } + } + + private GearmanJobResult getBootState(JSONObject jsonObject) { + Vector events = new Vector(); JSONArray jsonArray = (JSONArray) jsonObject.get("events"); for (Object eventObj : jsonArray) { String event = eventObj.toString(); @@ -38,99 +60,115 @@ public class StatusWorker extends AbstractGearmanFunction { } LinkedHashMap> res = new LinkedHashMap>(); LinkedHashMap content = new LinkedHashMap(); - if (type.equals("boot")) { - for (String event : events) { - Boot boot = BOOTTHREADS.get(event); - if (BOOTTHREADS.containsKey(event)) { - Vector clients = boot.getClients(); - if (boot.isFinished()) { - content.put("result shortcut", "successful"); - content.put("result text", "Booting of " + event - + " has been finished!"); - res.put(event, content); - BOOTTHREADS.remove(event); - boot = null; - } else if (boot.isFinishedWithErrors()) { - content.put("result shortcut", "failed"); - content.put("result text", "Booting of " + event - + " has not been finished, due to errors!"); - LinkedHashMap clientErrors = new LinkedHashMap(); - for (Client client : clients) { - if (!client.getError().isEmpty()) { - clientErrors.put(Integer.toString(client - .getId()), client.getError()); - } - } - content.put("clients errors", clientErrors); - res.put(event, content); - BOOTTHREADS.remove(event); - boot = null; - } else { - content.put("result shortcut", "not finished"); - content.put("result text", "Booting of " + event - + " has not yet been finished!"); - LinkedHashMap clientStatus = new LinkedHashMap(); - for (Client client : clients) { - clientStatus.put(Integer.toString(client.getId()), - client.getStateText()); + for (String event : events) { + BootState boot = BOOTSTATES.get(event); + if (BOOTSTATES.containsKey(event)) { + Vector clients = boot.getClients(); + if (boot.isFinished()) { + content.put("result shortcut", "successful"); + content.put("result text", "Booting of " + event + + " has been finished!"); + res.put(event, content); + BOOTSTATES.remove(event); + boot = null; + } else if (boot.isFinishedWithErrors()) { + content.put("result shortcut", "failed"); + content.put("result text", "Booting of " + event + + " has not been finished, due to errors!"); + LinkedHashMap clientErrors = new LinkedHashMap(); + for (Client client : clients) { + if (!client.getError().isEmpty()) { + clientErrors.put(Integer.toString(client.getId()), + client.getError()); } - content.put("clients states", clientStatus); - res.put(event, content); } + content.put("clients errors", clientErrors); + res.put(event, content); + BOOTSTATES.remove(event); + boot = null; } else { - content.put("result shortcut", "not founded"); - content - .put("result text", - "The Boot process for the event has not been found."); + content.put("result shortcut", "not finished"); + content.put("result text", "Booting of " + event + + " has not yet been finished!"); + LinkedHashMap clientStatus = new LinkedHashMap(); + for (Client client : clients) { + clientStatus.put(Integer.toString(client.getId()), + client.getStateText()); + } + content.put("clients states", clientStatus); res.put(event, content); } + } else { + content.put("result shortcut", "not founded"); + content.put("result text", + "The Boot process for the event has not been found."); + res.put(event, content); } - } else if (type.equals("shutdown")) { - for (String event : events) { - if (SHUTDOWNTHREADS.containsKey(event)) { - Shutdown shutdown = SHUTDOWNTHREADS.get(event); - Vector clients = shutdown.getClients(); - if (shutdown.isFinished()) { - content.put("result shortcut", "succeeded"); - content.put("result text", "Shutdown of " + event - + " has been finished!"); - res.put(event, content); - SHUTDOWNTHREADS.remove(event); - shutdown = null; - } else if (shutdown.isFinishedWithErrors()) { - content.put("result shortcut", "failed"); - content.put("result text", "Shutdown of " + event - + " has not been finished, due to errors!"); - LinkedHashMap clientErrors = new LinkedHashMap(); - for (Client client : clients) { - if (!client.getError().isEmpty()) { - clientErrors.put(Integer.toString(client - .getId()), client.getError()); - } - } - content.put("clients errors", clientErrors); - res.put(event, content); - SHUTDOWNTHREADS.remove(event); - shutdown = null; - } else { - content.put("result shortcut", "not finished"); - content.put("result text", "Shutdown of " + event - + " has not yet been finished!"); - LinkedHashMap clientStatus = new LinkedHashMap(); - for (Client client : clients) { - clientStatus.put(Integer.toString(client.getId()), - client.getStateText()); + } + String jsonResult = JSONValue.toJSONString(res); + byte[] warnings = new byte[0]; + byte[] exceptions = new byte[0]; + int numerator = 0; + int denominator = 0; + GearmanJobResult gjr = new GearmanJobResultImpl(this.jobHandle, true, + jsonResult.getBytes(), warnings, exceptions, numerator, + denominator); + return gjr; + } + + private GearmanJobResult getShutdownState(JSONObject jsonObject) { + Vector events = new Vector(); + JSONArray jsonArray = (JSONArray) jsonObject.get("events"); + for (Object eventObj : jsonArray) { + String event = eventObj.toString(); + events.add(event); + } + LinkedHashMap> res = new LinkedHashMap>(); + LinkedHashMap content = new LinkedHashMap(); + for (String event : events) { + if (SHUTDOWNSTATES.containsKey(event)) { + ShutdownState shutdown = SHUTDOWNSTATES.get(event); + Vector clients = shutdown.getClients(); + if (shutdown.isFinished()) { + content.put("result shortcut", "succeeded"); + content.put("result text", "Shutdown of " + event + + " has been finished!"); + res.put(event, content); + SHUTDOWNSTATES.remove(event); + shutdown = null; + } else if (shutdown.isFinishedWithErrors()) { + content.put("result shortcut", "failed"); + content.put("result text", "Shutdown of " + event + + " has not been finished, due to errors!"); + LinkedHashMap clientErrors = new LinkedHashMap(); + for (Client client : clients) { + if (!client.getError().isEmpty()) { + clientErrors.put(Integer.toString(client.getId()), + client.getError()); } - content.put("clients states", clientStatus); - res.put(event, content); } + content.put("clients errors", clientErrors); + res.put(event, content); + SHUTDOWNSTATES.remove(event); + shutdown = null; } else { - content.put("result shortcut", "not founded"); - content - .put("result text", - "The Shutdown process for the event has not been found."); + content.put("result shortcut", "not finished"); + content.put("result text", "Shutdown of " + event + + " has not yet been finished!"); + LinkedHashMap clientStatus = new LinkedHashMap(); + for (Client client : clients) { + clientStatus.put(Integer.toString(client.getId()), + client.getStateText()); + } + content.put("clients states", clientStatus); res.put(event, content); } + } else { + content.put("result shortcut", "not founded"); + content + .put("result text", + "The Shutdown process for the event has not been found."); + res.put(event, content); } } String jsonResult = JSONValue.toJSONString(res); @@ -143,4 +181,131 @@ public class StatusWorker extends AbstractGearmanFunction { denominator); return gjr; } + + private GearmanJobResult updateClientStateBoot(JSONObject jsonObject) { + String event = jsonObject.get("eventName").toString(); + String newState = jsonObject.get("newState").toString(); + String error = jsonObject.get("error").toString(); + int clientID = Integer.parseInt(jsonObject.get("clientID").toString()); + BootState boot = BOOTSTATES.get(event); + boot.setClientState(clientID, ClientState.valueOf(newState)); + if (!error.isEmpty()) { + boot.setClientError(clientID, error); + } + String jsonResult = "{client state successfully updated}"; + byte[] warnings = new byte[0]; + byte[] exceptions = new byte[0]; + int numerator = 0; + int denominator = 0; + GearmanJobResult gjr = new GearmanJobResultImpl(this.jobHandle, true, + jsonResult.getBytes(), warnings, exceptions, numerator, + denominator); + return gjr; + } + + private GearmanJobResult updateClientStateShutdown(JSONObject jsonObject) { + String event = jsonObject.get("eventName").toString(); + String newState = jsonObject.get("newState").toString(); + String error = jsonObject.get("error").toString(); + int clientID = Integer.parseInt(jsonObject.get("clientID").toString()); + ShutdownState shutdown = SHUTDOWNSTATES.get(event); + shutdown.setClientState(clientID, ClientState.valueOf(newState)); + if (!error.isEmpty()) { + shutdown.setClientError(clientID, error); + } + String jsonResult = "{client state successfully updated}"; + byte[] warnings = new byte[0]; + byte[] exceptions = new byte[0]; + int numerator = 0; + int denominator = 0; + GearmanJobResult gjr = new GearmanJobResultImpl(this.jobHandle, true, + jsonResult.getBytes(), warnings, exceptions, numerator, + denominator); + return gjr; + } + + private GearmanJobResult createBootState(JSONObject jsonObject) { + String event = jsonObject.get("eventName").toString(); + String eventOS = jsonObject.get("eventOS").toString(); + JSONArray jsonArray = (JSONArray) jsonObject.get("clients"); + Vector clients = new Vector(); + for (Object clientObj : jsonArray) { + JSONObject clientJsonObj = (JSONObject) clientObj; + Client client = new Client(clientJsonObj, "boot", event); + clients.add(client); + } + BootState boot = new BootState(event, clients, eventOS); + BOOTSTATES.put(event, boot); + String jsonResult = "{boot state successfully created}"; + byte[] warnings = new byte[0]; + byte[] exceptions = new byte[0]; + int numerator = 0; + int denominator = 0; + GearmanJobResult gjr = new GearmanJobResultImpl(this.jobHandle, true, + jsonResult.getBytes(), warnings, exceptions, numerator, + denominator); + return gjr; + } + + private GearmanJobResult createShutdownState(JSONObject jsonObject) { + String event = jsonObject.get("eventName").toString(); + JSONArray jsonArray = (JSONArray) jsonObject.get("clients"); + Vector clients = new Vector(); + for (Object clientObj : jsonArray) { + JSONObject clientJsonObj = (JSONObject) clientObj; + Client client = new Client(clientJsonObj, "shutdown", event); + clients.add(client); + } + ShutdownState shutdown = new ShutdownState(event, clients); + SHUTDOWNSTATES.put(event, shutdown); + String jsonResult = "{shutdown state successfully created}"; + byte[] warnings = new byte[0]; + byte[] exceptions = new byte[0]; + int numerator = 0; + int denominator = 0; + GearmanJobResult gjr = new GearmanJobResultImpl(this.jobHandle, true, + jsonResult.getBytes(), warnings, exceptions, numerator, + denominator); + return gjr; + } + + private GearmanJobResult finishBootState(JSONObject jsonObject) { + String event = jsonObject.get("eventName").toString(); + Boolean error = Boolean + .parseBoolean(jsonObject.get("error").toString()); + BootState boot = BOOTSTATES.get(event); + boot.finish(); + if (error) { + boot.error(); + } + String jsonResult = "{boot state successfully finished}"; + byte[] warnings = new byte[0]; + byte[] exceptions = new byte[0]; + int numerator = 0; + int denominator = 0; + GearmanJobResult gjr = new GearmanJobResultImpl(this.jobHandle, true, + jsonResult.getBytes(), warnings, exceptions, numerator, + denominator); + return gjr; + } + + private GearmanJobResult finishShutdownState(JSONObject jsonObject) { + String event = jsonObject.get("eventName").toString(); + Boolean error = Boolean + .parseBoolean(jsonObject.get("error").toString()); + ShutdownState shutdown = SHUTDOWNSTATES.get(event); + shutdown.finish(); + if (error) { + shutdown.error(); + } + String jsonResult = "{shutdown state successfully finished}"; + byte[] warnings = new byte[0]; + byte[] exceptions = new byte[0]; + int numerator = 0; + int denominator = 0; + GearmanJobResult gjr = new GearmanJobResultImpl(this.jobHandle, true, + jsonResult.getBytes(), warnings, exceptions, numerator, + denominator); + return gjr; + } } \ No newline at end of file -- cgit v1.2.3-55-g7522