调解系统后端服务

MyWebSocketHandler.java 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package com.ruoyi.common.websocket;
  2. import com.ruoyi.common.exception.ServiceException;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.stereotype.Component;
  5. import javax.websocket.*;
  6. import javax.websocket.server.PathParam;
  7. import javax.websocket.server.ServerEndpoint;
  8. import java.io.IOException;
  9. import java.util.HashMap;
  10. import java.util.Map;
  11. import java.util.concurrent.CopyOnWriteArraySet;
  12. /**
  13. * @author wangqiong
  14. * @description
  15. * @date 2023-11-25 15:16
  16. */
  17. @Component
  18. @Slf4j
  19. @ServerEndpoint("/websocket/{userName}")
  20. public class MyWebSocketHandler {
  21. // 接口路径 ws://127.0.0.1:9000/websocket;
  22. private Session session;
  23. //concurrent包的线程安全Set,用来存放每个客户端对应的WebSocket对象。
  24. private static CopyOnWriteArraySet<Session> sessions = new CopyOnWriteArraySet<>();
  25. // 用来存在线连接数
  26. private static Map<String, Session> sessionPool = new HashMap<>();
  27. /**
  28. * 链接成功调用的方法
  29. */
  30. @OnOpen
  31. public void onOpen(Session session, @PathParam(value = "userName") String userName) {
  32. try {
  33. sessions.add(session);
  34. sessionPool.put(userName, session);
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. /**
  40. * 链接关闭调用的方法
  41. */
  42. @OnClose
  43. public void onClose(Session session,@PathParam(value = "userName") String userName) {
  44. try {
  45. if(session!=null && session.isOpen()){
  46. session.close();
  47. sessions.remove(session);
  48. sessionPool.remove(userName);
  49. }
  50. log.info("【websocket消息】连接断开,总数为:" + sessions.size());
  51. } catch (Exception e) {
  52. e.printStackTrace();
  53. }
  54. }
  55. /**
  56. * 收到客户端消息后调用的方法
  57. *
  58. * @param message
  59. * @param
  60. */
  61. @OnMessage
  62. public void onMessage(@PathParam(value = "userName") String userName, String message) {
  63. System.out.println("【websocket消息】收到客户端消息:" + message);
  64. // 将消息广播给其它用户
  65. for (Session session : sessions) {
  66. if(session!=null && session.isOpen()){
  67. try {
  68. session.getBasicRemote().sendText(message);
  69. }catch (Exception e){
  70. throw new ServiceException(e.getMessage());
  71. }
  72. }else {
  73. try {
  74. session.close();
  75. } catch (IOException e) {
  76. throw new ServiceException(e.getMessage());
  77. }
  78. sessions.remove(session);
  79. sessionPool.remove(userName);
  80. }
  81. }
  82. }
  83. /**
  84. * 发送错误时的处理
  85. *
  86. * @param session
  87. * @param error
  88. */
  89. @OnError
  90. public void onError(Session session, Throwable error) {
  91. throw new ServiceException(error.getMessage());
  92. }
  93. /**
  94. * 推消息给前端
  95. *
  96. * @param userId
  97. * @param message
  98. * @return
  99. */
  100. public static Runnable sendOneMessage(String userId, String message) {
  101. Session session = sessionPool.get(userId);
  102. if (session != null && session.isOpen()) {
  103. try {
  104. log.info("【推给前端消息】 :" + message);
  105. //高并发下,防止session占用期间,被其他线程调用
  106. synchronized (session) {
  107. session.getBasicRemote().sendText(message);
  108. }
  109. } catch (Exception e) {
  110. e.printStackTrace();
  111. }
  112. }
  113. return null;
  114. }
  115. }