WebSocket實現實時推送資料到前端
阿新 • • 發佈:2018-12-21
@Component @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer{ @Resource goodsWebSocketHandler handler; public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { //配置對指定的url進行攔截 registry.addHandler(handler, "/mi/*").addInterceptors(new HandShakeInterceptor()); //允許客戶端使用SokcetJs registry.addHandler(handler, "/mi/*/*").addInterceptors(new HandShakeInterceptor()).withSockJS(); } }
/** * 每次建立連線都會進行握手,這個攔截器是用於處理握手前後的預處理工作 * @author Weiguo Liu * */ public class HandShakeInterceptor implements HandshakeInterceptor { public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { System.out.println("將要進入WebSocket預處理過程"); return true; } public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) { System.out.println("WebSocket預處理中...."); System.out.println("webSocket預處理完畢"); } }
@Component public class goodsWebSocketHandler implements WebSocketHandler { private volatile static List<WebSocketSession> users = new ArrayList<>(); private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Value("${googs.collage.push.time}") private Long collagePushTime; public void afterConnectionEstablished(WebSocketSession session) throws Exception { users.add(session); /*new Thread(new Runnable() { @Override public void run() { while(true) { for(WebSocketSession user:users) {//向每個線上的客戶端推送訊息,4秒推送一次 try { user.sendMessage(new TextMessage("伺服器推送訊息:" + sdf.format(new Date()))); } catch (IOException e) { e.printStackTrace(); } } try {//伺服器每5秒向每個線上的客戶端推送訊息 Thread.currentThread().sleep(30000); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start();*/ } public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception { String gainMessage = message.getPayload().toString(); // System.err.println("接收到客戶端:" + session.getId() + "傳送的訊息:" + gainMessage); Map params = null; if (MonkeyUtils.isNotEmpty(gainMessage)) { params = JSON.parseObject(gainMessage); } if(MonkeyUtils.isNotEmpty(params.get("HeartBeat")) || MonkeyUtils.isEmpty(gainMessage)){ Map map = new HashedMap(); map.put("HeartBeat",true); map.put("HeartBeatDate",sdf.format(new Date())); session.sendMessage(new TextMessage(JSON.toJSONString(map))); }else{ for (WebSocketSession mySession : users) { if (mySession.equals(session)) { synchronized (this) { if (session.isOpen()) { Map finalParams = params; new Thread(new Runnable() { @Override public void run() { while (true) { try { if(session.isOpen()){ //業務操作 查詢資料 List<Map> collages = new HashMap<>(); session.sendMessage(new TextMessage(JSON.toJSONString(collages))); }else{ break; } } catch (IOException e) { e.printStackTrace(); } try { //沒5秒重新整理一次 Thread.sleep(collagePushTime); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } } } } } } public void handleTransportError(WebSocketSession session,Throwable exception) throws Exception { users.remove(session); } public void afterConnectionClosed(WebSocketSession session,CloseStatus closeStatus) throws Exception { users.remove(session); session.close(); } public boolean supportsPartialMessages() { return false; } private List<Map> getData(WebSocketSession session,Map param){ return null; } }