Fixing shutdown of the server and using only one background cleaning thread.

This commit is contained in:
marcins78@gmail.com
2012-04-18 09:43:01 +00:00
parent fe267eeb35
commit a2c5eaebd9
3 changed files with 66 additions and 23 deletions

View File

@@ -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;
}
}
}

View File

@@ -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<AbstractServer> _servers = Collections.synchronizedSet(new HashSet<AbstractServer>());
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;
}
}
}

View File

@@ -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<Context, Type> {
return null;
}
@PreDestroy
public void destroyResources() {
getHallServerInjectable().getValue().stopServer();
getTradeServerInjectable().getValue().stopServer();
getLotroServerInjectable().getValue().stopServer();
getChatServerInjectable().getValue().stopServer();
}
private synchronized Injectable<LotroFormatLibrary> getLotroFormatLibraryInjectable() {
if (_lotroFormatLibraryInjectable == null) {
final LotroFormatLibrary lotroFormatLibrary = new LotroFormatLibrary(_library);