Удаление старых буферов

This commit is contained in:
RoyceDa
2026-02-25 19:18:54 +02:00
parent 95638d683a
commit 6c49549b95
4 changed files with 81 additions and 1 deletions

4
.env
View File

@@ -14,3 +14,7 @@ SDU_SERVERS=http://10.211.55.2:7777
#Firebase Credentials
FIREBASE_CREDENTIALS_PATH=serviceAccount.json
#Каждые сколько дней будет очищаться буфер (максимальная дистанция синхронизации сообщений)
BUFFER_CLEANUP_DAYS=7

View File

@@ -52,7 +52,7 @@ import im.rosetta.packet.Packet6Message;
import im.rosetta.packet.Packet7Read;
import im.rosetta.packet.Packet8Delivery;
import im.rosetta.packet.Packet9DeviceNew;
import im.rosetta.service.services.BufferCleanupService;
import io.orprotocol.Server;
import io.orprotocol.Settings;
import io.orprotocol.packet.PacketManager;
@@ -73,6 +73,7 @@ public class Boot {
private ServerAdapter serverAdapter;
private ClientManager clientManager;
private OnlineManager onlineManager;
private BufferCleanupService bufferCleanupService;
/**
* Конструктор по умолчанию, использует порт 3000 для сервера
@@ -96,6 +97,14 @@ public class Boot {
30
), packetManager, this.serverAdapter);
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.registerAllEvents();
this.printBootMessage();
this.bufferCleanupService.start();
return this;
}catch(Exception e){
this.logger.error(Color.RED + "Booting error, stack trace:");

View File

@@ -9,4 +9,18 @@ public class BufferRepository extends Repository<Buffer> {
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;
});
}
}

View File

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