From a2c5eaebd974286d90f0d613a9a5d2aceb97031e Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Wed, 18 Apr 2012 09:43:01 +0000 Subject: [PATCH] Fixing shutdown of the server and using only one background cleaning thread. --- .../com/gempukku/lotro/AbstractServer.java | 27 ++-------- .../com/gempukku/lotro/ServerCleaner.java | 53 +++++++++++++++++++ .../lotro/server/provider/ServerProvider.java | 9 ++++ 3 files changed, 66 insertions(+), 23 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/ServerCleaner.java diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/AbstractServer.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/AbstractServer.java index 8ec48a4e6..e9ce0e7db 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/AbstractServer.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/AbstractServer.java @@ -1,42 +1,23 @@ package com.gempukku.lotro; public abstract class AbstractServer { + private static ServerCleaner _cleaningTask = new ServerCleaner(); + private boolean _started; - private CleaningTask _cleaningTask; public final synchronized void startServer() { if (!_started) { - _cleaningTask = new CleaningTask(); - new Thread(_cleaningTask).start(); + _cleaningTask.addServer(this); _started = true; } } public final synchronized void stopServer() { if (_started) { - _cleaningTask.stop(); + _cleaningTask.removeServer(this); _started = false; } } protected abstract void cleanup(); - - private class CleaningTask implements Runnable { - private boolean _running = true; - - public void run() { - while (_running) { - cleanup(); - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // Ignore - } - } - } - - public void stop() { - _running = false; - } - } } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/ServerCleaner.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/ServerCleaner.java new file mode 100644 index 000000000..14d04ace7 --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/ServerCleaner.java @@ -0,0 +1,53 @@ +package com.gempukku.lotro; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +public class ServerCleaner { + private final Set _servers = Collections.synchronizedSet(new HashSet()); + private CleaningThread _thr; + + public synchronized void addServer(AbstractServer server) { + _servers.add(server); + if (_thr == null) { + _thr = new CleaningThread(); + _thr.start(); + } + } + + public synchronized void removeServer(AbstractServer server) { + _servers.remove(server); + if (_servers.size() == 0 && _thr != null) { + _thr.pleaseStop(); + _thr = null; + } + } + + private class CleaningThread extends Thread { + private boolean _stopped; + + public void run() { + try { + while (!_stopped) { + synchronized (ServerCleaner.this) { + for (AbstractServer server : _servers) { + try { + server.cleanup(); + } catch (Exception exp) { + // We can't do much about it + } + } + Thread.sleep(1000); + } + } + } catch (InterruptedException exp) { + // Thread interrupted - get lost + } + } + + public void pleaseStop() { + _stopped = true; + } + } +} diff --git a/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/provider/ServerProvider.java b/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/provider/ServerProvider.java index bb15e7003..e63d5b2ae 100644 --- a/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/provider/ServerProvider.java +++ b/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/provider/ServerProvider.java @@ -16,6 +16,7 @@ import com.sun.jersey.core.spi.component.ComponentScope; import com.sun.jersey.spi.inject.Injectable; import com.sun.jersey.spi.inject.InjectableProvider; +import javax.annotation.PreDestroy; import javax.ws.rs.core.Context; import javax.ws.rs.ext.Provider; import java.lang.reflect.Type; @@ -76,6 +77,14 @@ public class ServerProvider implements InjectableProvider { return null; } + @PreDestroy + public void destroyResources() { + getHallServerInjectable().getValue().stopServer(); + getTradeServerInjectable().getValue().stopServer(); + getLotroServerInjectable().getValue().stopServer(); + getChatServerInjectable().getValue().stopServer(); + } + private synchronized Injectable getLotroFormatLibraryInjectable() { if (_lotroFormatLibraryInjectable == null) { final LotroFormatLibrary lotroFormatLibrary = new LotroFormatLibrary(_library);