浏览代码

修复系统运行日志页面的 websocket 重连逻辑 bug

reghao 1 年之前
父节点
当前提交
aebf40af30
共有 2 个文件被更改,包括 121 次插入112 次删除
  1. 120 0
      mgr/src/main/resources/static/js/wsclient.js
  2. 1 112
      mgr/src/main/resources/templates/admin/log/rtlog.html

+ 120 - 0
mgr/src/main/resources/static/js/wsclient.js

@@ -0,0 +1,120 @@
+function setOnline() {
+    var span = document.getElementById("ws-status")
+    span.style = "background: green"
+    span.innerHTML = '在线'
+}
+
+function setOffline() {
+    var span = document.getElementById("ws-status")
+    span.style = "background: red"
+    span.innerHTML = '离线'
+}
+
+function process(payload) {
+    var app = '<span style="color: yellowgreen">' +  payload.app + '</span>'
+    var concat = '<span style="color: red">' +  '@' + '</span>'
+    var host = '<span style="color: yellowgreen">' +  payload.host + ' ' + '</span>'
+    var timestamp = payload.dateTimeStr
+    var thread = payload.thread
+    var level
+    if (payload.level === 'INFO') {
+        level = '<span style="color: green">' +  payload.level + ' ' + '</span>'
+    } else if (payload.level === 'ERROR') {
+        level = '<span style="color: red">' +  payload.level + ' ' + '</span>'
+    } else {
+        level = '<span style="color: yellow">' +  payload.level + ' ' + '</span>'
+    }
+
+    var logger = '<span style="color: wheat">' +  payload.logger + ' ' + '</span>'
+    var message = '<span style="color: white">' +  payload.message + ' ' + '</span>'
+
+    var text = app + concat +  host + ' ' + timestamp + ' ' + thread + ' ' + level + ' ' + logger + ' ' + message + '<br>'
+    add(text)
+}
+
+function add(text) {
+    var p = document.createElement("p");
+    p.innerHTML = text + '<br>'
+
+    var div = document.createElement("div");
+    div.appendChild(p)
+
+    var li = document.createElement("li");
+    div.className = 'layui-text'
+    li.appendChild(div)
+
+    var ul = document.getElementById("applog");
+    ul.appendChild(li);
+}
+
+function getUrl() {
+    var token = '0123456789'
+    var app = 'devops-mgr'
+    var host = 'localhost'
+    var params = 'token=' + token + '&app=' + app + '&host=' + host;
+
+    let protocol = location.protocol
+    let hostname = location.hostname
+    let port = location.port
+    let prefix;
+    if (protocol === 'https') {
+        if (port === 443) {
+            prefix = 'wss://' + hostname;
+        } else {
+            prefix = 'wss://' + hostname + ':' + port;
+        }
+    } else {
+        if (port === 80) {
+            prefix = 'ws://' + hostname;
+        } else {
+            prefix = 'ws://' + hostname + ':' + port;
+        }
+    }
+
+    return  prefix + '/ws/log/pull?' + params
+}
+
+var ws
+var reconnectLock = false
+function initWebSocket() {
+    if ("WebSocket" in window) {
+        var url = getUrl()
+        ws = new WebSocket(url);
+        ws.onopen = function() {
+            setOnline()
+            console.log("websocket connected...");
+        };
+        ws.onclose = function() {
+            setOffline()
+            console.log("websocket connection closed...");
+            reconnect()
+        };
+        ws.onerror = function () {
+            setOffline()
+            console.log("websocket connection error...");
+            reconnect()
+        };
+        ws.onmessage = function (evt) {
+            var payload = JSON.parse(evt.data)
+            process(payload)
+        }
+    } else {
+        // 浏览器不支持 WebSocket
+        alert("您的浏览器不支持 WebSocket!");
+    }
+}
+
+function reconnect() {
+    if (reconnectLock) return
+
+    reconnectLock = true
+    setTimeout(function () {
+        console.log('websocket reconnecting...')
+        initWebSocket()
+        reconnectLock = false
+    }, 5000)
+}
+
+function send(payload) {
+    ws.send(payload)
+}

+ 1 - 112
mgr/src/main/resources/templates/admin/log/rtlog.html

@@ -1,8 +1,6 @@
 <!DOCTYPE html>
 <html xmlns:th="http://www.thymeleaf.org">
 <head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
-    <link rel="stylesheet" th:href="@{/lib/zTree_v3/css/zTreeStyle/zTreeStyle.css}" type="text/css">
-    <link rel="stylesheet" th:href="@{/css/xterm.css}"/>
 </head>
 
 <body class="timo-layout-page">
@@ -19,117 +17,8 @@
 </body>
 <script th:replace="/common/template :: script"></script>
 <script type="text/javascript" th:src="@{/js/plugins/jquery-3.4.1.min.js}"></script>
+<script type="text/javascript" th:src="@{/js/wsclient.js}"></script>
 <script type="text/javascript" th:inline="javascript">
-    function add(text) {
-        var p = document.createElement("p");
-        p.innerHTML = text + '<br>'
-
-        var div = document.createElement("div");
-        div.className = 'layui-text'
-        div.appendChild(p)
-
-        var li = document.createElement("li");
-        li.appendChild(div)
-
-        var ul = document.getElementById("applog");
-        //ul.prepend(li);
-        ul.appendChild(li);
-    }
-
-    function setOnline() {
-        var span = document.getElementById("ws-status")
-        span.style = "background: green"
-        span.innerHTML = '在线'
-    }
-
-    function setOffline() {
-        var span = document.getElementById("ws-status")
-        span.style = "background: red"
-        span.innerHTML = '离线'
-    }
-
-    var connected = false
-    var ws
-    function initWebSocket() {
-        if ("WebSocket" in window) {
-            var token = '0123456789'
-            var app = 'devops-mgr'
-            var host = 'localhost'
-            var params = 'token=' + token + '&app=' + app + '&host=' + host;
-
-            let protocol = location.protocol
-            let hostname = location.hostname
-            let port = location.port
-            let prefix;
-            if (protocol === 'https') {
-                if (port === 443) {
-                    prefix = 'wss://' + hostname;
-                } else {
-                    prefix = 'wss://' + hostname + ':' + port;
-                }
-            } else {
-                if (port === 80) {
-                    prefix = 'ws://' + hostname;
-                } else {
-                    prefix = 'ws://' + hostname + ':' + port;
-                }
-            }
-
-            var url = prefix + '/ws/log/pull?' + params
-            ws = new WebSocket(url);
-            ws.onopen = function() {
-                connected = true
-                setOnline()
-                // Web Socket 已连接上,使用 send() 方法发送数据
-                console.log("websocket connected...");
-            };
-            ws.onclose = function() {
-                connected = false
-                setOffline()
-                console.log("websocket connection closed...");
-                reconnect()
-            };
-            ws.onerror = function () {
-                connected = false
-                setOffline()
-                console.log("websocket connection error...");
-                reconnect()
-            };
-            ws.onmessage = function (evt) {
-                var payload = JSON.parse(evt.data)
-                var app = '<span style="color: yellowgreen">' +  payload.app + '</span>'
-                var concat = '<span style="color: red">' +  '@' + '</span>'
-                var host = '<span style="color: yellowgreen">' +  payload.host + ' ' + '</span>'
-                var timestamp = payload.dateTimeStr
-                var thread = payload.thread
-                var level
-                if (payload.level === 'INFO') {
-                    level = '<span style="color: green">' +  payload.level + ' ' + '</span>'
-                } else if (payload.level === 'ERROR') {
-                    level = '<span style="color: red">' +  payload.level + ' ' + '</span>'
-                } else {
-                    level = '<span style="color: yellow">' +  payload.level + ' ' + '</span>'
-                }
-
-                var logger = '<span style="color: wheat">' +  payload.logger + ' ' + '</span>'
-                var message = '<span style="color: white">' +  payload.message + ' ' + '</span>'
-
-                var text = app + concat +  host + ' ' + timestamp + ' ' + thread + ' ' + level + ' ' + logger + ' ' + message + '<br>'
-                add(text)
-            }
-        } else {
-            // 浏览器不支持 WebSocket
-            alert("您的浏览器不支持 WebSocket!");
-        }
-    }
-    function reconnect() {
-        if (connected) return
-
-        setTimeout(function () {
-            console.log('websocket reconnecting...')
-            initWebSocket()
-        }, 5000)
-    }
     initWebSocket()
 </script>
 </html>