Хэндшейк, сервисы, аннотационные блокировки в протоколе, репозитории
This commit is contained in:
@@ -11,6 +11,7 @@ import org.java_websocket.handshake.ClientHandshake;
|
||||
import org.java_websocket.server.WebSocketServer;
|
||||
|
||||
import io.orprotocol.client.Client;
|
||||
import io.orprotocol.lock.ThreadLocker;
|
||||
import io.orprotocol.packet.Packet;
|
||||
import io.orprotocol.packet.PacketExecutor;
|
||||
import io.orprotocol.packet.PacketManager;
|
||||
@@ -22,6 +23,7 @@ public class Server extends WebSocketServer {
|
||||
private ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
|
||||
private Context context;
|
||||
private ServerListener listener;
|
||||
private ThreadLocker threadLocker = new ThreadLocker();
|
||||
|
||||
/**
|
||||
* Конструктор сервера
|
||||
@@ -144,10 +146,27 @@ public class Server extends WebSocketServer {
|
||||
*/
|
||||
return;
|
||||
}
|
||||
executor.onPacketReceived(packet, client);
|
||||
/**
|
||||
* Проверяем наличие блокировки для данного пакета и ключа в аннотации @Lock.
|
||||
*/
|
||||
if(!threadLocker.acquireLock(packet, executorClass)) {
|
||||
/**
|
||||
* Если блокировка уже существует, значит другой поток обрабатывает пакет
|
||||
* с таким же значением lockFor, отклоняем текущий пакет.
|
||||
*/
|
||||
return;
|
||||
}
|
||||
try {
|
||||
executor.onPacketReceived(packet, client);
|
||||
} finally {
|
||||
/**
|
||||
* Снимаем блокировку после обработки пакета.
|
||||
*/
|
||||
threadLocker.releaseLock(packet, executorClass);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.out.println("Error while processing packet " + packetClass.getName());
|
||||
System.out.println(e.getStackTrace());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user