Удаление старых буферов
This commit is contained in:
4
.env
4
.env
@@ -14,3 +14,7 @@ SDU_SERVERS=http://10.211.55.2:7777
|
|||||||
|
|
||||||
#Firebase Credentials
|
#Firebase Credentials
|
||||||
FIREBASE_CREDENTIALS_PATH=serviceAccount.json
|
FIREBASE_CREDENTIALS_PATH=serviceAccount.json
|
||||||
|
|
||||||
|
#Каждые сколько дней будет очищаться буфер (максимальная дистанция синхронизации сообщений)
|
||||||
|
BUFFER_CLEANUP_DAYS=7
|
||||||
|
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ import im.rosetta.packet.Packet6Message;
|
|||||||
import im.rosetta.packet.Packet7Read;
|
import im.rosetta.packet.Packet7Read;
|
||||||
import im.rosetta.packet.Packet8Delivery;
|
import im.rosetta.packet.Packet8Delivery;
|
||||||
import im.rosetta.packet.Packet9DeviceNew;
|
import im.rosetta.packet.Packet9DeviceNew;
|
||||||
|
import im.rosetta.service.services.BufferCleanupService;
|
||||||
import io.orprotocol.Server;
|
import io.orprotocol.Server;
|
||||||
import io.orprotocol.Settings;
|
import io.orprotocol.Settings;
|
||||||
import io.orprotocol.packet.PacketManager;
|
import io.orprotocol.packet.PacketManager;
|
||||||
@@ -73,6 +73,7 @@ public class Boot {
|
|||||||
private ServerAdapter serverAdapter;
|
private ServerAdapter serverAdapter;
|
||||||
private ClientManager clientManager;
|
private ClientManager clientManager;
|
||||||
private OnlineManager onlineManager;
|
private OnlineManager onlineManager;
|
||||||
|
private BufferCleanupService bufferCleanupService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Конструктор по умолчанию, использует порт 3000 для сервера
|
* Конструктор по умолчанию, использует порт 3000 для сервера
|
||||||
@@ -96,6 +97,14 @@ public class Boot {
|
|||||||
30
|
30
|
||||||
), packetManager, this.serverAdapter);
|
), packetManager, this.serverAdapter);
|
||||||
this.clientManager = new ClientManager(server);
|
this.clientManager = new ClientManager(server);
|
||||||
|
/**
|
||||||
|
* Каждые сколько дней будет очищаться буфер (это влияет на синхронизацию сообщений, так
|
||||||
|
* как при синхронизации клиент запрашивает пакеты из буфера за последние 7 дней, если этот параметр будет меньше,
|
||||||
|
* то клиенты не смогут синхронизировать старые сообщения)
|
||||||
|
*/
|
||||||
|
int cleanupEveryDays = System.getenv("BUFFER_CLEANUP_DAYS") != null ?
|
||||||
|
Integer.parseInt(System.getenv("BUFFER_CLEANUP_DAYS")) : 7;
|
||||||
|
this.bufferCleanupService = new BufferCleanupService(cleanupEveryDays, this.logger);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -141,6 +150,7 @@ public class Boot {
|
|||||||
this.registerAllExecutors();
|
this.registerAllExecutors();
|
||||||
this.registerAllEvents();
|
this.registerAllEvents();
|
||||||
this.printBootMessage();
|
this.printBootMessage();
|
||||||
|
this.bufferCleanupService.start();
|
||||||
return this;
|
return this;
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
this.logger.error(Color.RED + "Booting error, stack trace:");
|
this.logger.error(Color.RED + "Booting error, stack trace:");
|
||||||
|
|||||||
@@ -9,4 +9,18 @@ public class BufferRepository extends Repository<Buffer> {
|
|||||||
super(Buffer.class);
|
super(Buffer.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Удаляет все записи страше чем timestampMs
|
||||||
|
* @param timestampMs метка времени в миллисекундах, все записи с меткой времени меньше которой будут удалены
|
||||||
|
*/
|
||||||
|
public void deleteOlderThan(long timestampMs) {
|
||||||
|
this.executeInTransaction(session -> {
|
||||||
|
String hql = "DELETE FROM Buffer WHERE timestamp < :timestamp";
|
||||||
|
session.createMutationQuery(hql)
|
||||||
|
.setParameter("timestamp", timestampMs)
|
||||||
|
.executeUpdate();
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,52 @@
|
|||||||
|
package im.rosetta.service.services;
|
||||||
|
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import im.rosetta.database.repository.BufferRepository;
|
||||||
|
import im.rosetta.logger.Logger;
|
||||||
|
import im.rosetta.logger.enums.Color;
|
||||||
|
|
||||||
|
public class BufferCleanupService {
|
||||||
|
|
||||||
|
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
|
||||||
|
private final BufferRepository bufferRepository = new BufferRepository();
|
||||||
|
private final int cleanupEveryDays;
|
||||||
|
private final Logger logger;
|
||||||
|
|
||||||
|
public BufferCleanupService(int cleanupEveryDays, Logger logger) {
|
||||||
|
this.cleanupEveryDays = cleanupEveryDays;
|
||||||
|
this.logger = logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Запускает планировщик, который будет каждые 24 часа удалять из буфера
|
||||||
|
* пакеты старше чем cleanupEveryDays дней
|
||||||
|
*/
|
||||||
|
public void start() {
|
||||||
|
this.logger.info(Color.CYAN + "Sheduled cleanup buffer every " + this.cleanupEveryDays + " days");
|
||||||
|
scheduler.scheduleAtFixedRate(
|
||||||
|
this::cleanupOldPackets,
|
||||||
|
0, //стартовая задержка 0, то есть сразу при запуске сервиса будет выполнена очистка буфера
|
||||||
|
24,
|
||||||
|
TimeUnit.HOURS
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Функция планировщика, которая удаляет из буфера пакеты старше чем cleanupEveryDays дней
|
||||||
|
*/
|
||||||
|
private void cleanupOldPackets() {
|
||||||
|
try {
|
||||||
|
long sevenDaysAgo = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(this.cleanupEveryDays);
|
||||||
|
bufferRepository.deleteOlderThan(sevenDaysAgo);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stop() {
|
||||||
|
scheduler.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user