- 背景:
最近涉及消息通知功能,在管理員創建發送消息時,登陸用戶可以實時接收到新增消息的提醒,避免頻繁刷新,通過websocket取代輪詢setInterval。
- Spring boot部分:
- POM.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>
- 新建配置類:
package io.xcc.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; @Configuration public class WebSocketConfig { /** * 注入ServerEndpointExporter, * 這個bean會自動注冊使用了@ServerEndpoint注解聲明的Websocket endpoint */ @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }
- 新建實現類:
package io.xcc.common.socket; import java.util.HashMap; import java.util.Map; import java.util.concurrent.CopyOnWriteArraySet; import javax.websocket.OnClose; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import org.springframework.stereotype.Component; @Component @ServerEndpoint("/websocket/{userName}") //此注解相當於設置訪問URL public class WebSocket { private Session session; private static CopyOnWriteArraySet<WebSocket> webSockets =new CopyOnWriteArraySet<>(); private static Map<String,Session> sessionPool = new HashMap<String,Session>(); @OnOpen public void onOpen(Session session, @PathParam(value="userName")String userName) { this.session = session; webSockets.add(this); sessionPool.put(userName, session); System.out.println(userName+"【websocket消息】有新的連接,總數為:"+webSockets.size()); } @OnClose public void onClose() { webSockets.remove(this); System.out.println("【websocket消息】連接斷開,總數為:"+webSockets.size()); } @OnMessage public void onMessage(String message) { System.out.println("【websocket消息】收到客戶端消息:"+message); } // 此為廣播消息 public void sendAllMessage(String message) { for(WebSocket webSocket : webSockets) { System.out.println("【websocket消息】廣播消息:"+message); try { webSocket.session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); } } } // 此為單點消息 public void sendOneMessage(String userName, String message) { System.out.println("【websocket消息】單點消息:"+message); Session session = sessionPool.get(userName); if (session != null) { try { session.getAsyncRemote()