Browse Source

ws fix

master
gsd 2 days ago
parent
commit
e5d9755d27
  1. 38
      src/main/java/app/websocket/handlers/ServersHandler.java

38
src/main/java/app/websocket/handlers/ServersHandler.java

@ -8,6 +8,9 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.TextMessage;
@ -15,11 +18,8 @@ import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler; import org.springframework.web.socket.handler.TextWebSocketHandler;
import java.io.IOException; import java.io.IOException;
import java.util.Collection; import java.util.*;
import java.util.Collections; import java.util.concurrent.*;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Component @Component
public class ServersHandler extends TextWebSocketHandler implements BaseWebsocketHandler { public class ServersHandler extends TextWebSocketHandler implements BaseWebsocketHandler {
@ -27,6 +27,8 @@ public class ServersHandler extends TextWebSocketHandler implements BaseWebsocke
private final Map<String, WebSocketSession> activeSessions = new ConcurrentHashMap<>(); private final Map<String, WebSocketSession> activeSessions = new ConcurrentHashMap<>();
private ObjectMapper objectMapper = new ObjectMapper(); private ObjectMapper objectMapper = new ObjectMapper();
private Stats stats; private Stats stats;
private final BlockingQueue<TextMessage> q = new LinkedBlockingQueue<>();
private boolean q_run = true;
@Autowired @Autowired
ServersHandler(Stats stats) { ServersHandler(Stats stats) {
@ -34,6 +36,25 @@ public class ServersHandler extends TextWebSocketHandler implements BaseWebsocke
this.stats = stats; this.stats = stats;
} }
@EventListener(ApplicationReadyEvent.class)
public void pusher() throws InterruptedException {
while (q_run) { //ага иди нахуй, я врот ебал кто такое не уважает
try {
TextMessage textMessage = q.take();
push2All(textMessage);
} catch (Exception e) {
logger.error("Cannot push ws message", e);
} finally {
Thread.sleep(50);
}
}
}
@EventListener(ContextClosedEvent.class)
public void disablePusher(ContextClosedEvent event) {
this.q_run = false;
}
@Override @Override
public String getPath() { public String getPath() {
return "servers"; return "servers";
@ -64,7 +85,7 @@ public class ServersHandler extends TextWebSocketHandler implements BaseWebsocke
private void push2All(TextMessage msg) throws IOException { private void push2All(TextMessage msg) throws IOException {
for (Map.Entry<String, WebSocketSession> otherSession : Collections.synchronizedSet(activeSessions.entrySet())) { for (Map.Entry<String, WebSocketSession> otherSession : Collections.synchronizedSet(activeSessions.entrySet())) {
try { try {
synchronized (otherSession) { synchronized (otherSession.getValue()) {
otherSession.getValue().sendMessage(msg); otherSession.getValue().sendMessage(msg);
} }
} catch (Exception err) { } catch (Exception err) {
@ -95,8 +116,9 @@ public class ServersHandler extends TextWebSocketHandler implements BaseWebsocke
public void pushServer(String srv, Server server) { public void pushServer(String srv, Server server) {
try { try {
push2All(getServersPayload(srv, server)); if (!q.offer(getServersPayload(srv, server)));
} catch (IOException err) { logger.warn("Cannot fill ws status queue, da blya max int mojet i ne hvatit ebanutiy 4tole blya");
} catch (Exception err) {
logger.error("Cannot send message"); logger.error("Cannot send message");
} }
} }

Loading…
Cancel
Save