Files
contract-manager/server/src/main/java/com/ecep/contract/service/WebSocketService.java
songqq c42ff7501d refactor: 重构WebSocket服务及相关实体类
重构WebSocket服务名称从WebSocketService改为WebSocketClientService,并实现Serializable接口
添加WebSocket常量定义和消息处理实现
优化实体类equals和hashCode方法
修复控制器路径和日志配置
添加查询服务和任务接口方法
2025-09-17 11:45:50 +08:00

125 lines
3.9 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.ecep.contract.service;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import com.ecep.contract.handler.MessageNotitfication;
import com.ecep.contract.handler.WebSocketServerHandler;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* WebSocket消息服务
* 提供向客户端发送WebSocket消息的功能
*/
@Service
public class WebSocketService {
private static final Logger logger = Logger.getLogger(WebSocketService.class.getName());
private final WebSocketServerHandler webSocketHandler;
@Autowired
private ObjectMapper objectMapper;
public WebSocketService(WebSocketServerHandler webSocketHandler) {
this.webSocketHandler = webSocketHandler;
}
/**
* 向所有连接的客户端广播消息
*
* @param message 要广播的消息内容
*/
public void broadcastMessage(String message) {
try {
TextMessage textMessage = new TextMessage(message);
webSocketHandler.broadcast(textMessage);
logger.info("广播消息: " + message);
} catch (Exception e) {
logger.log(Level.SEVERE, "广播消息失败: " + e.getMessage(), e);
}
}
/**
* 向特定会话发送消息
*
* @param session WebSocket会话
* @param message 要发送的消息内容
*/
public void sendMessage(WebSocketSession session, String message) {
try {
if (session != null && session.isOpen()) {
session.sendMessage(new TextMessage(message));
logger.info("向会话发送消息: " + session.getId() + ", 消息: " + message);
}
} catch (IOException e) {
logger.log(Level.SEVERE, "向会话发送消息失败: " + session.getId() + ", 原因: " + e.getMessage(), e);
}
}
/**
* 获取当前活跃的WebSocket会话数量
*
* @return 活跃会话数
*/
public int getActiveSessionCount() {
return webSocketHandler.getActiveSessionCount();
}
/**
* 发送系统通知
*
* @param notification 通知内容
*/
public void sendSystemNotification(String notification) {
MessageNotitfication messageNotitfication = new MessageNotitfication();
messageNotitfication.setType("notification");
messageNotitfication.setContent(notification);
try {
String jsonMessage = objectMapper.writeValueAsString(messageNotitfication);
broadcastMessage(jsonMessage);
} catch (Exception e) {
logger.log(Level.SEVERE, "发送系统通知失败: " + e.getMessage(), e);
}
}
/**
* 发送业务数据更新通知
*
* @param dataType 数据类型
* @param operation 操作类型create, update, delete
* @param id 数据ID
*/
public void sendDataUpdate(String dataType, String operation, String id) {
String message = String.format(
"{\"type\":\"data_update\",\"dataType\":\"%s\",\"operation\":\"%s\",\"id\":\"%s\"}",
escapeJson(dataType),
escapeJson(operation),
escapeJson(id));
broadcastMessage(message);
}
/**
* 转义JSON字符串中的特殊字符
*
* @param text 要转义的文本
* @return 转义后的文本
*/
private String escapeJson(String text) {
if (text == null) {
return "";
}
return text
.replace("\\", "\\\\")
.replace("\"", "\\\"")
.replace("\b", "\\b")
.replace("\f", "\\f")
.replace("\n", "\\n")
.replace("\r", "\\r")
.replace("\t", "\\t");
}
}