From 28cd840d5d383968bf1a2269193b18fa8e530725 Mon Sep 17 00:00:00 2001
From: Junjie <xjj@123>
Date: 星期三, 03 四月 2024 14:25:43 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/Four-Way-Rack' into Four-Way-Rack
---
/dev/null | 44 --------
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/map/websocket/MapWebSocket.java | 72 ++++++++++++++
zy-asrs-flow/src/pages/map/websocket.js | 116 +++++++++++++++-------
zy-asrs-flow/src/pages/map/index.jsx | 10 +-
zy-asrs-flow/src/config/setting.ts | 1
5 files changed, 157 insertions(+), 86 deletions(-)
diff --git a/zy-asrs-flow/src/config/setting.ts b/zy-asrs-flow/src/config/setting.ts
index 0d5a234..c457ca9 100644
--- a/zy-asrs-flow/src/config/setting.ts
+++ b/zy-asrs-flow/src/config/setting.ts
@@ -1,5 +1,6 @@
// 鎺ュ彛鍦板潃
export const API_BASE_URL: string = 'http://127.0.0.1:9090/wcs';
+export const WEBSOCKET_BASE_URL: string = 'ws://127.0.0.1:9090/wcs';
export const API_TIMEOUT: number = 60;
diff --git a/zy-asrs-flow/src/pages/map/index.jsx b/zy-asrs-flow/src/pages/map/index.jsx
index 5709878..2fec0aa 100644
--- a/zy-asrs-flow/src/pages/map/index.jsx
+++ b/zy-asrs-flow/src/pages/map/index.jsx
@@ -8,14 +8,13 @@
FileAddOutlined,
CompressOutlined,
SettingOutlined,
- CloseOutlined
} from '@ant-design/icons';
import './index.css'
import { createStyles } from 'antd-style';
import Edit from './components/device';
import Settings from './components/settings'
import * as Utils from './utils'
-import * as Websocket from './websocket'
+import WebSocketClient from './websocket'
import Player from './player';
import MapSearch from './header/search';
import MapFloor from './header/floor';
@@ -61,7 +60,7 @@
SETTINGS_MODEL: "3",
})
-let player;
+let player, websocket;
const Map = () => {
const intl = useIntl();
@@ -104,6 +103,9 @@
Utils.syncMapContainer(player.mapContainer);
Utils.syncNotify(notify);
+ websocket = new WebSocketClient('/ws/map/websocket');
+ websocket.connect();
+
const handleResize = () => {
setWindowSize({
width: window.innerWidth,
@@ -123,8 +125,6 @@
player.adaptScreen();
Utils.mapNotify(intl.formatMessage({ id: 'map.load.success', defaultMessage: '娆㈣繋浣跨敤WCS绯荤粺' }));
}, 200)
-
- Websocket.createWs();
}
initialize();
}, []);
diff --git a/zy-asrs-flow/src/pages/map/websocket.js b/zy-asrs-flow/src/pages/map/websocket.js
index 20dea9b..1b4b9a5 100644
--- a/zy-asrs-flow/src/pages/map/websocket.js
+++ b/zy-asrs-flow/src/pages/map/websocket.js
@@ -1,42 +1,84 @@
-export const createWs = () => {
- console.log('Creating WebSocket connection...');
- const webSocket = new WebSocket('ws://127.0.0.1:9090/wcs/map/websocket');
+import { WEBSOCKET_BASE_URL } from '@/config/setting';
- // 杩炴帴鎵撳紑鏃惰Е鍙�
- webSocket.onopen = function (event) {
- console.log('WebSocket connection opened:', event);
- // 鍦ㄦ娣诲姞鍙互鍦ㄨ繛鎺ユ墦寮�鏃跺彂閫佺殑浠讳綍娑堟伅
- // webSocket.send('Hello Server!');
- };
+export default class WebSocketClient {
- // 浠庢湇鍔″櫒鎺ユ敹鍒版秷鎭椂瑙﹀彂
- webSocket.onmessage = function (event) {
- console.log('WebSocket message received:', event.data);
- // 鍦ㄨ繖閲屽鐞嗘帴鏀跺埌鐨勬秷鎭�
- };
+ constructor(path) {
+ this.url = WEBSOCKET_BASE_URL + path;
+ this.webSocket = null;
+ this.heartbeatInterval = null; // Store the interval ID
+ this.heartbeatFrequency = 30000; // Heartbeat every 10 seconds
+ }
- // 鍑虹幇閿欒鏃惰Е鍙�
- webSocket.onerror = function (event) {
- console.error('WebSocket error observed:', event);
- // 鍦ㄨ繖閲屽鐞哤ebSocket閿欒
- };
-
- // 杩炴帴鍏抽棴鏃惰Е鍙�
- webSocket.onclose = function (event) {
- console.log('WebSocket connection closed:', event);
- // 鍦ㄨ繖閲屽鐞嗚繛鎺ュ叧闂簨浠�
- // 浣犲彲鑳芥兂瑕侀噸鏂拌繛鎺ユ垨瀵圭敤鎴疯繘琛屽弸濂芥彁绀�
- };
-
- // 璇锋眰鍏抽棴WebSocket杩炴帴锛堜富鍔ㄥ叧闂級锛屼綘鍙互浠庡叾浠栧嚱鏁拌皟鐢ㄨ繖涓�
- const closeWebSocket = () => {
- if (webSocket.readyState === WebSocket.OPEN) {
- webSocket.close(); // 杩欏皢瑙﹀彂'onclose'浜嬩欢
+ connect() {
+ if (!this.url) {
+ console.error('WebSocketClient: Cannot connect without url.');
+ return;
}
- };
- return {
- webSocket,
- closeWebSocket
- };
-};
\ No newline at end of file
+ this.webSocket = new WebSocket(this.url);
+
+ this.webSocket.onopen = (event) => {
+ console.log('websocket connection opened.');
+ // Start the heartbeat
+ this.startHeartbeat();
+ };
+
+ this.webSocket.onmessage = (event) => {
+ console.log('websocket message received:', event.data);
+ this.onMessage(event.data);
+ };
+
+ this.webSocket.onerror = (event) => {
+ console.error('websocket error observed:', event);
+ };
+
+ this.webSocket.onclose = (event) => {
+ console.log('websocket connection closed!');
+ // Clear the heartbeat
+ this.stopHeartbeat();
+ this.reconnect();
+ };
+ }
+
+ sendMessage(message) {
+ if (this.webSocket && this.webSocket.readyState === WebSocket.OPEN) {
+ this.webSocket.send(message);
+ } else {
+ console.error('WebSocketClient: Cannot send message, WebSocket connection is not open.');
+ }
+ }
+
+ onMessage(data) {
+ // 瀛愮被鍙兘浼氶噸鍐欒繖涓柟娉曟潵澶勭悊娑堟伅
+ console.log('WebSocketClient: Message received:', data);
+ }
+
+ close() {
+ if (this.webSocket && this.webSocket.readyState === WebSocket.OPEN) {
+ this.webSocket.close();
+ }
+ }
+
+ reconnect() {
+ setTimeout(() => {
+ console.log('WebSocketClient: Attempting to reconnect...');
+ this.connect();
+ }, 3000);
+ }
+
+ startHeartbeat() {
+ if(this.heartbeatInterval) {
+ clearInterval(this.heartbeatInterval);
+ }
+ this.heartbeatInterval = setInterval(() => {
+ this.sendMessage('1');
+ }, this.heartbeatFrequency);
+ }
+
+ stopHeartbeat() {
+ if (this.heartbeatInterval) {
+ clearInterval(this.heartbeatInterval);
+ this.heartbeatInterval = null;
+ }
+ }
+}
\ No newline at end of file
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/map/websocket/MapWebSocket.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/map/websocket/MapWebSocket.java
new file mode 100644
index 0000000..193a1a4
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/map/websocket/MapWebSocket.java
@@ -0,0 +1,72 @@
+package com.zy.asrs.wcs.core.map.websocket;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.*;
+import javax.websocket.server.ServerEndpoint;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Slf4j
+@Component
+@ServerEndpoint(value = "/ws/map/websocket")
+public class MapWebSocket {
+
+ private static final long MAX_IDLE_TIMEOUT = 120 * 1000;
+
+ private static final ConcurrentHashMap<String, Session> sessions = new ConcurrentHashMap<>();
+
+ @OnOpen
+ public void onOpen(Session session) {
+ session.setMaxIdleTimeout(MAX_IDLE_TIMEOUT);
+ sessions.put(session.getId(), session);
+ log.info("Opened new session in instance " + session.getId());
+ }
+
+ @OnMessage
+ public void onMessage(String message, Session session) {
+ if (!message.equals("1")) {
+ log.info("Received WebSocket message: {}", message);
+ }
+ }
+
+ @OnClose
+ public void onClose(Session session) {
+ sessions.remove(session.getId());
+ log.info("Closed WebSocket session: {}", session.getId());
+ }
+
+ @OnError
+ public void onError(Session session, Throwable error) {
+ error.printStackTrace();
+ log.error("Error in WebSocket session: {}", session.getId(), error);
+ try {
+ session.close();
+ } catch (Exception e) {
+ log.error("Error closing session: {}", session.getId(), e);
+ } finally {
+ sessions.remove(session.getId());
+ }
+ }
+
+ public static void sendMessage(Session session, String message) {
+ if(session.isOpen()){
+ try {
+ session.getBasicRemote().sendText(message);
+ } catch (Exception e) {
+ log.error("Failed to send message to session: {}", session.getId(), e);
+ }
+ }
+ }
+
+ public static void broadcast(String message) {
+ sessions.forEach((id, session) -> {
+ try {
+ session.getBasicRemote().sendText(message);
+ } catch (Exception e) {
+ log.error("Failed to send message to session: {}", id, e);
+ }
+ });
+ }
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/map/websocket/MapWebsocket.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/map/websocket/MapWebsocket.java
deleted file mode 100644
index 795d89a..0000000
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/map/websocket/MapWebsocket.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.zy.asrs.wcs.core.map.websocket;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-import javax.websocket.*;
-import javax.websocket.server.ServerEndpoint;
-
-@Slf4j
-@Component
-@ServerEndpoint(value = "/ws/map/websocket")
-public class MapWebsocket {
-
- private Session session;
- private String sessionId;
-
- @OnOpen
- public void onOpen(Session session) {
- this.session = session;
- this.sessionId = session.getId();
- log.info("{} connected", this.sessionId);
- }
-
- @OnMessage
- public void onMessage(String message, Session session) {
- log.info("{} sendMsg:{}", this.sessionId, message);
- }
-
- @OnClose
- public void onClose(Session session) {
- log.info("{} closed", this.sessionId);
- }
-
- /**
- * @ Param session
- * @ Param error
- */
- @OnError
- public void onError(Session session, Throwable error) {
- log.error("鍙戠敓閿欒");
- error.printStackTrace();
- }
-
-}
--
Gitblit v1.9.1