Во-первых, если тетя Ася решит зарядить свой телефон и вынет сервер из розетки, то Вас ничто не спасет. На такие случаи решение - сохранение данных всех менеджеров через определенные промежутки времени. Элементарно решается синглтоном и отдельным методом на сохранение всех данных, как банальный пример:
[src=java]
class MyManager
{
private static MyManager instance = new MyManager();
private MyManager()
{
ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new Runnable() { MyManager.getInstance().save(); }, 60 * 60 * 1000, 60 * 60, 1000);
}
public static MyManager getInstance() { return instance; }
public void save() { /* Something is going on here */ }
}
[/src]
В таком случае максимум Вы потеряете 1 час развития игрового мира. Можно поставить меньший промежуток, но Вы сами должны понимать, что чем промежуток меньше, тем, соответственно, больше нагрузка на сервер и БД.
Вторая Ваша проблема "Что делать, если я убил сервер лопатой", ну, то есть, некорректно завершил его работу (ибо по-другому я не знаю, как это назвать - оно на то и называется "некорректно", чтобы люди понимали, что так делать нельзя).
Так вот, ее Вы можете решить с помощью
runtime-хука:
[src=java]
Runtime.getRuntime().addShutdownHook(
new Thread(new Runnable(
@Override
public void run() {
// The same MyManager as example
MyManager.getInstance().save();
}
))
);
[/src]
Но в этом случае возможет еще один исход: в Windows, допустим, есть Force Shutdown, от которого не спасет и этот хук.
Опять же, я еще раз намекну, что не нужно пинать сервер таким образом - Вы только проблем себе наживаете, на реальных проектах никто не закрывает сервера через Ctrl + C.