| | |
| | | import org.springframework.stereotype.Component; |
| | | import org.springframework.web.socket.WebSocketSession; |
| | | |
| | | /** |
| | | * 实现了websocket模块中的JsonMessageHandler,实时看板使用该处理器,payload中应该携带type:"realTimeData"属性 |
| | | */ |
| | | @Component |
| | | public class RealTimeDataJsonMessageHandler implements JsonMessageHandler<RealTimeDataRequestJsonWebSocketMessage> { |
| | | private final IOrderWorkstationService orderWorkstationService; |
| | |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public String type() { |
| | | return "realTimeData"; |
| | | } |
| | | |
| | | @Override |
| | | public Class<RealTimeDataRequestJsonWebSocketMessage> getMessageClass() { |
| | | return RealTimeDataRequestJsonWebSocketMessage.class; |
| | | } |
| | |
| | | import java.util.List; |
| | | import com.qianwen.core.websocket.message.AbstractJsonWebSocketMessage; |
| | | |
| | | /** |
| | | * 实时看板中的返回信息:workstationIdList,涉及状态,运行时间等信息 |
| | | */ |
| | | public class RealTimeDataRequestJsonWebSocketMessage extends AbstractJsonWebSocketMessage { |
| | | private List<String> workstationIdList; |
| | | |
| | |
| | | @Bean |
| | | public WebSocketConfigurer webSocketConfigurer(List<HandshakeInterceptor> handshakeInterceptor, WebSocketHandler webSocketHandler) { |
| | | return registry -> { |
| | | //普通websocket支持 |
| | | registry.addHandler(webSocketHandler, new String[]{this.webSocketProperties.getPath()}).setAllowedOrigins(new String[]{this.webSocketProperties.getAllowOrigins()}).addInterceptors((HandshakeInterceptor[]) handshakeInterceptor.toArray(new HandshakeInterceptor[0])); |
| | | //提供降级为SockJS的支持 |
| | | registry.addHandler(webSocketHandler, new String[]{this.webSocketProperties.getSockJsPath()}).setAllowedOrigins(new String[]{this.webSocketProperties.getAllowOrigins()}).addInterceptors((HandshakeInterceptor[]) handshakeInterceptor.toArray(new HandshakeInterceptor[0])).withSockJS(); |
| | | }; |
| | | } |
| | |
| | | }).collect(Collectors.toList()); |
| | | } |
| | | |
| | | @Override // com.qianwen.core.websocket.custom.SubscriptionSessionFilter |
| | | @Override |
| | | public void onClose(WebSocketSession session) { |
| | | } |
| | | } |
| | |
| | | import org.springframework.web.socket.server.HandshakeInterceptor; |
| | | |
| | | public class UserAttributeHandshakeInterceptor implements HandshakeInterceptor { |
| | | @Override |
| | | public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> attributes) throws Exception { |
| | | BladeUser user = AuthUtil.getUser(); |
| | | if (Func.isEmpty(user)) { |
| | |
| | | attributes.put("USER_KEY_ATTR_NAME", user); |
| | | return true; |
| | | } |
| | | |
| | | @Override |
| | | public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Exception e) { |
| | | } |
| | | } |
| | |
| | | this.planTextMessageHandler = planTextMessageHandler; |
| | | } |
| | | |
| | | @Override |
| | | public void handleTextMessage(WebSocketSession session, TextMessage message) throws JsonProcessingException { |
| | | if (message.getPayloadLength() == 0) { |
| | | return; |
| | |
| | | import org.springframework.web.socket.WebSocketSession; |
| | | import org.springframework.web.socket.handler.WebSocketHandlerDecorator; |
| | | |
| | | /** |
| | | * 一个WebSocketHandler,(装饰器模式),处理WebSocketSession的存取和关闭 |
| | | */ |
| | | public class MapSessionWebSocketHandlerDecorator extends WebSocketHandlerDecorator { |
| | | private final SessionKeyGenerator sessionKeyGenerator; |
| | | |
| | |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | import java.util.stream.Collectors; |
| | | import org.springframework.web.socket.WebSocketSession; |
| | | |
| | | /** |
| | | * websocketsession存取 |
| | | */ |
| | | public class WebSocketSessionHolder { |
| | | private static final Map<Object, Set<WebSocketSession>> USER_SESSION_MAP = new ConcurrentHashMap(); |
| | | private static final Map<Object, Set<WebSocketSession>> USER_SESSION_MAP = new ConcurrentHashMap<>(); |
| | | |
| | | private WebSocketSessionHolder() { |
| | | } |
| | |
| | | } |
| | | |
| | | public static Collection<WebSocketSession> getSessions() { |
| | | return (Collection) USER_SESSION_MAP.values().stream().flatMap((v0) -> { |
| | | return v0.stream(); |
| | | }).collect(Collectors.toList()); |
| | | return USER_SESSION_MAP.values().stream().flatMap(Collection::stream).collect(Collectors.toList()); |
| | | } |
| | | |
| | | public static Set<Object> SessionKeys() { |