Better exception handling.

This commit is contained in:
FrozenCow 2011-02-08 20:59:51 +01:00
parent 89c8d564a4
commit 38ee8657e8
6 changed files with 88 additions and 78 deletions

View File

@ -79,61 +79,63 @@ public class MapManager extends Thread {
} }
void renderFullWorld(Location l) { void renderFullWorld(Location l) {
debugger.debug("Full render starting..."); synchronized (lock) {
for (MapType map : maps) { debugger.debug("Full render starting...");
HashSet<MapTile> found = new HashSet<MapTile>(); for (MapType map : maps) {
HashSet<MapTile> rendered = new HashSet<MapTile>(); HashSet<MapTile> found = new HashSet<MapTile>();
LinkedList<MapTile> renderQueue = new LinkedList<MapTile>(); HashSet<MapTile> rendered = new HashSet<MapTile>();
LinkedList<DynmapChunk> loadedChunks = new LinkedList<DynmapChunk>(); LinkedList<MapTile> renderQueue = new LinkedList<MapTile>();
LinkedList<DynmapChunk> loadedChunks = new LinkedList<DynmapChunk>();
for (MapTile tile : map.getTiles(l)) {
if (!found.contains(tile)) { for (MapTile tile : map.getTiles(l)) {
found.add(tile); if (!found.contains(tile)) {
renderQueue.add(tile); found.add(tile);
renderQueue.add(tile);
}
} }
} while (!renderQueue.isEmpty()) {
while (!renderQueue.isEmpty()) { MapTile tile = renderQueue.pollFirst();
MapTile tile = renderQueue.pollFirst();
DynmapChunk[] requiredChunks = tile.getMap().getRequiredChunks(tile);
DynmapChunk[] requiredChunks = tile.getMap().getRequiredChunks(tile);
// Unload old chunks.
// Unload old chunks. while (loadedChunks.size() >= Math.max(0, 200 - requiredChunks.length)) {
while (loadedChunks.size() >= Math.max(0, 200 - requiredChunks.length)) { DynmapChunk c = loadedChunks.pollFirst();
world.unloadChunk(c.x, c.y, false, true);
}
// Load the required chunks.
for (DynmapChunk chunk : requiredChunks) {
boolean wasLoaded = world.isChunkLoaded(chunk.x, chunk.y);
world.loadChunk(chunk.x, chunk.y, false);
if (!wasLoaded)
loadedChunks.add(chunk);
}
debugger.debug("renderQueue: " + renderQueue.size() + "/" + found.size());
if (map.render(tile)) {
found.remove(tile);
rendered.add(tile);
updateQueue.pushUpdate(new Client.Tile(tile.getName()));
for (MapTile adjTile : map.getAdjecentTiles(tile)) {
if (!(found.contains(adjTile) || rendered.contains(adjTile))) {
found.add(adjTile);
renderQueue.add(adjTile);
}
}
}
found.remove(tile);
System.gc();
}
// Unload remaining chunks to clean-up.
while (!loadedChunks.isEmpty()) {
DynmapChunk c = loadedChunks.pollFirst(); DynmapChunk c = loadedChunks.pollFirst();
world.unloadChunk(c.x, c.y, false, true); world.unloadChunk(c.x, c.y, false, true);
} }
// Load the required chunks.
for (DynmapChunk chunk : requiredChunks) {
boolean wasLoaded = world.isChunkLoaded(chunk.x, chunk.y);
world.loadChunk(chunk.x, chunk.y, false);
if (!wasLoaded)
loadedChunks.add(chunk);
}
debugger.debug("renderQueue: " + renderQueue.size() + "/" + found.size());
if (map.render(tile)) {
found.remove(tile);
rendered.add(tile);
updateQueue.pushUpdate(new Client.Tile(tile.getName()));
for (MapTile adjTile : map.getAdjecentTiles(tile)) {
if (!(found.contains(adjTile) || rendered.contains(adjTile))) {
found.add(adjTile);
renderQueue.add(adjTile);
}
}
}
found.remove(tile);
System.gc();
}
// Unload remaining chunks to clean-up.
while (!loadedChunks.isEmpty()) {
DynmapChunk c = loadedChunks.pollFirst();
world.unloadChunk(c.x, c.y, false, true);
} }
debugger.debug("Full render finished.");
} }
debugger.debug("Full render finished.");
} }
private MapType[] loadMapTypes(ConfigurationNode configuration) { private MapType[] loadMapTypes(ConfigurationNode configuration) {

View File

@ -1,7 +1,6 @@
package org.dynmap.web; package org.dynmap.web;
import java.io.IOException;
public interface HttpHandler { public interface HttpHandler {
void handle(String path, HttpRequest request, HttpResponse response) throws IOException; void handle(String path, HttpRequest request, HttpResponse response) throws Exception;
} }

View File

@ -75,7 +75,7 @@ public class HttpServerConnection extends Thread {
public void run() { public void run() {
try { try {
socket.setSoTimeout(30000); socket.setSoTimeout(5000);
HttpRequest request = new HttpRequest(); HttpRequest request = new HttpRequest();
if (!readRequestHeader(socket.getInputStream(), request)) { if (!readRequestHeader(socket.getInputStream(), request)) {
@ -106,10 +106,13 @@ public class HttpServerConnection extends Thread {
try { try {
handler.handle(relativePath, request, response); handler.handle(relativePath, request, response);
} catch (IOException e) {
throw e;
} catch (Exception e) { } catch (Exception e) {
log.log(Level.SEVERE, "HttpHandler '" + handler + "' has thown an exception", e); log.log(Level.SEVERE, "HttpHandler '" + handler + "' has thown an exception", e);
e.printStackTrace(); if (socket != null) {
socket.close(); socket.close();
}
return; return;
} }

View File

@ -1,7 +1,6 @@
package org.dynmap.web.handlers; package org.dynmap.web.handlers;
import java.io.BufferedOutputStream; import java.io.BufferedOutputStream;
import java.io.IOException;
import java.util.Date; import java.util.Date;
import java.util.Map; import java.util.Map;
@ -16,7 +15,7 @@ public class ClientConfigurationHandler implements HttpHandler {
this.configuration = configuration; this.configuration = configuration;
} }
@Override @Override
public void handle(String path, HttpRequest request, HttpResponse response) throws IOException { public void handle(String path, HttpRequest request, HttpResponse response) throws Exception {
String s = Json.stringifyJson(configuration); String s = Json.stringifyJson(configuration);
byte[] bytes = s.getBytes(); byte[] bytes = s.getBytes();

View File

@ -1,7 +1,6 @@
package org.dynmap.web.handlers; package org.dynmap.web.handlers;
import java.io.BufferedOutputStream; import java.io.BufferedOutputStream;
import java.io.IOException;
import java.util.Date; import java.util.Date;
import org.bukkit.World; import org.bukkit.World;
@ -26,7 +25,7 @@ public class ClientUpdateHandler implements HttpHandler {
} }
@Override @Override
public void handle(String path, HttpRequest request, HttpResponse response) throws IOException { public void handle(String path, HttpRequest request, HttpResponse response) throws Exception {
long current = System.currentTimeMillis(); long current = System.currentTimeMillis();
long cutoff = 0; long cutoff = 0;

View File

@ -56,30 +56,38 @@ public abstract class FileHandler implements HttpHandler {
} }
@Override @Override
public void handle(String path, HttpRequest request, HttpResponse response) throws IOException { public void handle(String path, HttpRequest request, HttpResponse response) throws Exception {
path = formatPath(path); InputStream fileInput = null;
InputStream fileInput = getFileInput(path);
if (fileInput == null) {
response.statusCode = 404;
response.statusMessage = "Not found";
return;
}
String extension = getExtension(path);
String mimeType = getMimeTypeFromExtension(extension);
response.fields.put("Content-Type", mimeType);
response.fields.put("Connection", "close");
OutputStream out = response.getBody();
try { try {
int readBytes; path = formatPath(path);
while ((readBytes = fileInput.read(readBuffer)) > 0) { fileInput = getFileInput(path);
out.write(readBuffer, 0, readBytes); if (fileInput == null) {
response.statusCode = 404;
response.statusMessage = "Not found";
return;
}
String extension = getExtension(path);
String mimeType = getMimeTypeFromExtension(extension);
response.fields.put("Content-Type", mimeType);
response.fields.put("Connection", "close");
OutputStream out = response.getBody();
try {
int readBytes;
while ((readBytes = fileInput.read(readBuffer)) > 0) {
out.write(readBuffer, 0, readBytes);
}
} catch (IOException e) {
fileInput.close();
throw e;
} }
} catch (IOException e) {
fileInput.close(); fileInput.close();
} catch (Exception e) {
if (fileInput != null) {
try { fileInput.close(); } catch (IOException ex) { }
}
throw e; throw e;
} }
fileInput.close();
} }
} }