Оптимизация буферов, избежание многократных чтений
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user