Оптимизация буферов, избежание многократных чтений
This commit is contained in:
@@ -9,6 +9,7 @@ import im.rosetta.database.QuerySession;
|
|||||||
import im.rosetta.database.entity.Buffer;
|
import im.rosetta.database.entity.Buffer;
|
||||||
import im.rosetta.database.repository.BufferRepository;
|
import im.rosetta.database.repository.BufferRepository;
|
||||||
import im.rosetta.exception.UnauthorizedExeception;
|
import im.rosetta.exception.UnauthorizedExeception;
|
||||||
|
import im.rosetta.packet.Packet7Read;
|
||||||
import im.rosetta.service.Service;
|
import im.rosetta.service.Service;
|
||||||
import im.rosetta.service.services.runtime.PacketBuffer;
|
import im.rosetta.service.services.runtime.PacketBuffer;
|
||||||
import io.orprotocol.ProtocolException;
|
import io.orprotocol.ProtocolException;
|
||||||
@@ -71,6 +72,29 @@ public class BufferService extends Service<BufferRepository> {
|
|||||||
public void pushPacketToBuffer(String from, String to, Packet packet) {
|
public void pushPacketToBuffer(String from, String to, Packet packet) {
|
||||||
int packetId = this.packetManager.getPacketIdByClass(packet.getClass());
|
int packetId = this.packetManager.getPacketIdByClass(packet.getClass());
|
||||||
packet.packetId = packetId;
|
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();
|
byte[] packetBytes = packet.write().getBuffer();
|
||||||
Buffer buffer = new Buffer();
|
Buffer buffer = new Buffer();
|
||||||
buffer.setFrom(from);
|
buffer.setFrom(from);
|
||||||
|
|||||||
Reference in New Issue
Block a user