From a90dd74b809b8f3a444628b32af80f6aebd91c70 Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Sun, 13 Apr 2014 14:38:39 +0200 Subject: [PATCH] Exception handling for Harvester Service future executor handler This should show any runtime exceptions of the Runnable(), because something kills the task after some time, probably an exception. --- src/services/object/ObjectService.java | 3 +- src/services/resources/HarvesterService.java | 42 +++++++++++++++++--- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index f4385f18..4dd8d8d5 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -397,8 +397,7 @@ public class ObjectService implements INetworkDispatch { float positionY = core.terrainService.getHeight(planet.getID(), position.x, position.z)-1f; Point3D newpoint = new Point3D(position.x,positionY,position.z); - object = new HarvesterObject(objectID, planet, Template, newpoint, orientation); - core.harvesterService.addHarvester(object); + object = new HarvesterObject(objectID, planet, Template, newpoint, orientation); } else { return null; diff --git a/src/services/resources/HarvesterService.java b/src/services/resources/HarvesterService.java index 71d2a276..95cee397 100644 --- a/src/services/resources/HarvesterService.java +++ b/src/services/resources/HarvesterService.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.Map; import java.util.Random; import java.util.Vector; +import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; @@ -149,14 +150,39 @@ public class HarvesterService implements INetworkDispatch { } }, 10, 5000, TimeUnit.MILLISECONDS); - + + ExecutionSurveillanceThread executionSurveillance = new ExecutionSurveillanceThread(task); + executionSurveillance.start(); } + class ExecutionSurveillanceThread extends Thread { + ScheduledFuture task; + + public ExecutionSurveillanceThread(ScheduledFuture task) { + this.task = task; + } + + public void run() { + try { + try { + task.get(); + } catch (InterruptedException e1) { + System.err.println("InterruptedException IN HARVESTERSERVICE !!! " + e1.getMessage()); + } + } catch (ExecutionException e2) { + System.err.println("EXCEPTION IN HARVESTERSERVICE !!! " + e2.getMessage()); + System.err.println("EXCEPTION CAUSE : " + e2.getCause()); + } + } + } + public void ServiceProcessing(){ synchronized(allHarvesters){ for (HarvesterObject harvester : allHarvesters){ - updateHarvester(harvester); + if (harvester!=null) + updateHarvester(harvester); } + allHarvesters.removeAll(Collections.singleton(null)); } synchronized(allConstructors){ Vector removeConstructors = new Vector(); @@ -166,19 +192,22 @@ public class HarvesterService implements INetworkDispatch { removeConstructors.add(constructor); } allConstructors.removeAll(removeConstructors); + allConstructors.removeAll(Collections.singleton(null)); } } public void addHarvester(SWGObject harvester){ synchronized(allHarvesters){ - allHarvesters.add((HarvesterObject)harvester); + if (harvester!=null) + allHarvesters.add((HarvesterObject)harvester); } } public void removeHarvester(SWGObject harvester){ synchronized(allHarvesters){ - allHarvesters.remove((HarvesterObject)harvester); + if (harvester!=null) + allHarvesters.remove((HarvesterObject)harvester); } } @@ -432,6 +461,7 @@ public class HarvesterService implements INetworkDispatch { deed.setSurplusPower((int)harvester.getPowerLevel()); deed.setAttributes(); + removeHarvester(harvester); core.objectService.destroyObject(harvester.getObjectID()); SWGObject crafterInventory = owner.getSlottedObject("inventory"); @@ -969,6 +999,8 @@ public class HarvesterService implements INetworkDispatch { float positionY = NGECore.getInstance().terrainService.getHeight(actor.getPlanetId(), object.getPosition().x, object.getPosition().z); harvester.setPosition(new Point3D(object.getPosition().x,positionY, object.getPosition().z)); core.simulationService.add(harvester, harvester.getPosition().x, harvester.getPosition().z, true); + addHarvester(harvester); + PlayerObject player = (PlayerObject) actor.getSlottedObject("ghost"); WaypointObject constructionWaypoint = (WaypointObject)NGECore.getInstance().objectService.createObject("object/waypoint/shared_world_waypoint_blue.iff", actor.getPlanet(), harvester.getPosition().x, 0 ,harvester.getPosition().z); String displayname = "@installation_n:"+harvester.getStfName(); @@ -1020,7 +1052,7 @@ public class HarvesterService implements INetworkDispatch { public void enterStructurePlacementMode(SWGObject object, CreatureObject actor){ - if (!core.terrainService.canBuildAtPosition(actor,actor.getPosition().x,actor.getPosition().z)){ + if (!actor.getClient().isGM() && !core.terrainService.canBuildAtPosition(actor,actor.getPosition().x,actor.getPosition().z)){ actor.sendSystemMessage("@player_structure:not_permitted", (byte) 0); return; }