1、配置websocket
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
// 使用单例实例而非Spring容器管理
registry.addHandler(NativeWebSocketClient.getInstance(), "/ws")
.setAllowedOriginPatterns("*");
}
}
2、实现广播工具类
@Slf4j
public class WebSocketClient extends TextWebSocketHandler {
private final static ConcurrentHashMap<String, WebSocketSession> sessions = new ConcurrentHashMap<>();
private static volatile WebSocketClient instance;
private WebSocketClient() {
}
public static WebSocketClient getInstance() {
if (instance == null) {
synchronized (WebSocketClient.class) {
if (instance == null) {
instance = new WebSocketClient();
}
}
}
return instance;
}
private static void send(String message) {
log.info("会话发布剩余会话数: {}", sessions.size());
sessions.forEach((id, session) -> {
try {
if (session.isOpen()) {
synchronized (session.getId()){
session.sendMessage(new TextMessage(message));
}
}
}
catch (IOException e) {
// 清理无效会话
sessions.remove(id);
}
});
}
@Override
public void afterConnectionEstablished(@NotNull WebSocketSession session) {
sessions.put(session.getId(), session);
log.info("会话添加: {} | 当前会话数: {}", session.getId(), sessions.size());
}
@Override
public void afterConnectionClosed(WebSocketSession session, @NotNull CloseStatus status) {
sessions.remove(session.getId());
log.info("会话移除: {} | 剩余会话数: {}", session.getId(), sessions.size());
}
}
每次调用send方法都会清理无效会话,适用于工业系统场景,低连接数并需要实时推送特定消息给每一个用户,如仓库实时看板,在每一次入库出库等相关操作后广播消息