mirror of
https://github.com/webbukkit/dynmap.git
synced 2024-12-25 10:07:37 +01:00
Better exception handling.
This commit is contained in:
parent
89c8d564a4
commit
38ee8657e8
@ -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) {
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user