Parcourir la source

httpclient 是为了微信小程序端的下发提醒使用

cr7118@sina.cn il y a 3 ans
Parent
commit
bb60081b0e

+ 1 - 0
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/ApplicationTaskApplication.java

@@ -3,6 +3,7 @@ package com.jihengbel.intelligent.applicationtask;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.web.socket.config.annotation.EnableWebSocket;
 
 @SpringBootApplication
 @MapperScan(value="com.jihengbel.intelligent.applicationtask.model.**" )

+ 40 - 0
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/websocket/Test.java

@@ -0,0 +1,40 @@
+package com.jihengbel.intelligent.applicationtask.websocket;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.socket.TextMessage;
+import org.springframework.web.socket.WebSocketSession;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+@RestController
+public class Test {
+
+    /**
+     *
+     * @throws IOException
+     */
+    @GetMapping("/websocket/pushone")
+    public void pushTest() throws IOException {
+        List<String> pool = new ArrayList<String>( WsSessionManager.SESSION_POOL.keySet());
+        for(String key:pool){
+            try {
+                sendMsgtoPad(key);
+            }catch (Throwable e){
+                WsSessionManager.removeAndClose(key);//异常移除以免内存泄漏
+            }
+        }
+    }
+
+
+
+
+    private void sendMsgtoPad(String key) throws IOException {
+        WebSocketSession session=WsSessionManager.get(key);
+        if(session!=null){
+            session.sendMessage(new TextMessage("test111111111111111111111111111啥地方啥地方回家"));
+        }
+    }
+}

+ 44 - 0
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/websocket/WebSocketConfig.java

@@ -0,0 +1,44 @@
+package com.jihengbel.intelligent.applicationtask.websocket;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.TaskScheduler;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.socket.config.annotation.EnableWebSocket;
+import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
+import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
+
+@Configuration
+@EnableWebSocket
+@RestController
+public class WebSocketConfig implements WebSocketConfigurer {
+
+    @Autowired
+    private WebSocketHandler webSocketHandler;
+    @Autowired
+    private WebSocketHandshakeInterceptor webSocketInterceptor;
+
+    @Override
+    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
+        registry
+                .addHandler(webSocketHandler, "ws/pad")
+                .addInterceptors(webSocketInterceptor)
+                .setAllowedOrigins("*");
+    }
+
+    @Bean
+    public TaskScheduler taskScheduler(){
+        ThreadPoolTaskScheduler taskScheduler=new ThreadPoolTaskScheduler();
+        taskScheduler.setPoolSize(40);
+        taskScheduler.initialize();
+        return taskScheduler;
+    }
+
+//
+//    @Bean
+//    public ServerEndpointExporter serverEndpointExporter(){
+//        return new ServerEndpointExporter();
+//    }
+}

+ 66 - 0
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/websocket/WebSocketHandler.java

@@ -0,0 +1,66 @@
+package com.jihengbel.intelligent.applicationtask.websocket;
+
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.CloseStatus;
+import org.springframework.web.socket.TextMessage;
+import org.springframework.web.socket.WebSocketSession;
+import org.springframework.web.socket.handler.TextWebSocketHandler;
+
+@Component
+public class WebSocketHandler extends TextWebSocketHandler {
+
+    /**
+     * 建立成功事件
+     * @param session
+     * @throws Exception
+     */
+    @Override
+    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
+        Object token = session.getAttributes().get("token");
+        if (token != null) {
+            WsSessionManager.add(token.toString(), session);   // 用户连接成功,放入在线用户缓存  存储信息可以使用redis代替
+        } else {
+            throw new RuntimeException("用户登录已经失效!");
+        }
+    }
+
+
+    /**
+     * 接收消息事件
+     *
+     * @param session
+     * @param message
+     * @throws Exception
+     */
+    @Override
+    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
+        String payload = message.getPayload();
+        Object token = session.getAttributes().get("token");
+        session.sendMessage(new TextMessage("test"));
+    }
+
+    /**
+     * 关闭
+     * @param session
+     * @param status
+     * @throws Exception
+     */
+    @Override
+    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
+        Object token = session.getAttributes().get("token");
+        if (token != null) {
+            WsSessionManager.remove(token.toString());
+        }
+    }
+
+    /**
+     * 异常处理
+     * @param session
+     * @param exception
+     * @throws Exception
+     */
+    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
+        WsSessionManager.removeAndClose(String.valueOf(session.getAttributes().get("token")));
+    }
+
+}

+ 38 - 0
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/websocket/WebSocketHandshakeInterceptor.java

@@ -0,0 +1,38 @@
+package com.jihengbel.intelligent.applicationtask.websocket;
+
+import cn.hutool.http.HttpUtil;
+import org.springframework.http.server.ServerHttpRequest;
+import org.springframework.http.server.ServerHttpResponse;
+import org.springframework.http.server.ServletServerHttpRequest;
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.WebSocketHandler;
+import org.springframework.web.socket.server.HandshakeInterceptor;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 过来过滤安全确定 验证用户身份
+ */
+@Component
+public class WebSocketHandshakeInterceptor implements HandshakeInterceptor {
+
+    @Override
+    public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> attributes) throws Exception {
+
+        ServletServerHttpRequest request = (ServletServerHttpRequest) serverHttpRequest;
+        String token = request.getServletRequest().getParameter("token");
+        // des 对userid加密即可也可以是jwt测试先不做 因为pad的提醒都是工作人员,详单与这个部分需要userid,因为需要从这个信息知道这个人是谁,这样我们就可以在token
+        // 这样我们就可以在任务提醒中查询后直接用key获取session推送 因为websocket只推送工作人员,所以不需要做区分同意存一个map即可
+        if (token != null) {
+            attributes.put("token", token);
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Exception e) {
+
+    }
+}

+ 55 - 0
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/websocket/WsSessionManager.java

@@ -0,0 +1,55 @@
+package com.jihengbel.intelligent.applicationtask.websocket;
+
+import org.springframework.web.socket.WebSocketSession;
+
+import java.io.IOException;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class WsSessionManager {
+
+    public final static ConcurrentHashMap<String, WebSocketSession> SESSION_POOL = new ConcurrentHashMap<>();
+    /**
+     * 添加 session
+     *
+     * @param key
+     */
+    public static void add(String key, WebSocketSession session) {
+        SESSION_POOL.put(key, session);
+    }
+
+    /**
+     * 删除 session,会返回删除的 session
+     *
+     * @param key
+     * @return
+     */
+    public static WebSocketSession remove(String key) {
+        return SESSION_POOL.remove(key);
+    }
+
+    /**
+     * 删除并同步关闭连接
+     *
+     * @param key
+     */
+    public static void removeAndClose(String key) {
+        WebSocketSession session = remove(key);
+        if (session != null) {
+            try {
+                session.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * 获得 session
+     *
+     * @param key
+     * @return
+     */
+    public static WebSocketSession get(String key) {
+        return SESSION_POOL.get(key);
+    }
+}