서버 모니터링 시스템 구축 중 Tomcat Comet으로 했던걸 WebSocket로 변경 하였다.
단순함!
WebSocket Servlet 에서는 Client Open/Close 만 관리하는 public static Set 객체에 Client 정보를 관리하고, Queue Receive 에서 해당 Set 객체에 접근 하여 각각의 Client 에 데이터를 Push 한다.
Thread 간 통신에 public static 변수를 사용하는게 좋은건지 모르겠으나.. Thread 관련 지식이 부족한 관계로 현재는 우선 패스한다.
import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @ServerEndpoint(value = "/ws/was") public class WasWebSocket { private static Logger log = LoggerFactory.getLogger(WasWebSocket.class); public static Setconnections = new CopyOnWriteArraySet<>(); private Session session; public WasWebSocket() { log.info("----------- thread start"); } public Session getSession() { return this.session; } @OnOpen public void onOpen(Session session) { log.info("onOpen this: {}, this.sessson: {}", this.getClass(), session); this.session = session; synchronized (connections){ connections.add(this); } } @OnClose public void onClose() { log.info("onClose"); synchronized (connections){ connections.remove(this); } } @OnMessage public void onMessage(String message) { log.info("@OnMessage"); log.info("websocket message: " + message); } @OnError public void onError(Throwable t) throws Throwable { log.error("e: ", t.toString()); synchronized (connections){ connections.remove(this); } } }
function wasStatusListen() { var oSocket = new WebSocket(WS_URL + "/ws/was"); oSocket.onmessage = function (e) { var json = eval("(" + e.data + ")"); if (json.result && json.result == "0000") { var wasNode = json.data.name; var heapUsedPercent = json.data.heapUsedPercent; .. .. 처리 } }; oSocket.onopen = function (e) { console.log("open"); }; oSocket.onclose = function (e) { console.log("close"); wasStatusListen(); }; window.unload = function() { if (oSocket.readyState != 3) oSocket.disconnect(); } } wasStatusListen();