Оптимизация буферов, избежание многократных чтений

This commit is contained in:
RoyceDa
2026-02-16 13:53:29 +02:00
parent 7dc94678ba
commit 421531d73c

View File

@@ -9,6 +9,7 @@ import im.rosetta.database.QuerySession;
import im.rosetta.database.entity.Buffer;
import im.rosetta.database.repository.BufferRepository;
import im.rosetta.exception.UnauthorizedExeception;
import im.rosetta.packet.Packet7Read;
import im.rosetta.service.Service;
import im.rosetta.service.services.runtime.PacketBuffer;
import io.orprotocol.ProtocolException;
@@ -71,6 +72,29 @@ public class BufferService extends Service<BufferRepository> {
public void pushPacketToBuffer(String from, String to, Packet packet) {
int packetId = this.packetManager.getPacketIdByClass(packet.getClass());
packet.packetId = packetId;
if(packet instanceof Packet7Read){
/**
* Если это пакет чтения, то получаем последний пакет из буфера, если это уже чтение - то чтение больше не нужно
* записывать, так как эффект от нескольких пакетов чтения один и тот же, как и от одного, однако
* клиенты иногда порождают много пакетов чтения (на каждую загрузку диалога)
*/
String hql = "FROM Buffer WHERE from = :from AND to = :to ORDER BY timestamp DESC";
HashMap<String, Object> parameters = new HashMap<>();
parameters.put("from", from);
parameters.put("to", to);
try(QuerySession<Buffer> querySession = this.getRepository().buildQuery(hql, parameters)){
List<Buffer> buffers = querySession.getQuery().setMaxResults(1).list();
if(!buffers.isEmpty()){
Buffer buffer = buffers.get(0);
if(buffer.getPacketId() == packetId){
/**
* Последний пакет в буфере уже является пакетом чтения, значит нет смысла добавлять еще один
*/
return;
}
}
}
}
byte[] packetBytes = packet.write().getBuffer();
Buffer buffer = new Buffer();
buffer.setFrom(from);