浏览代码

fix webSocket

he2802 3 年之前
父节点
当前提交
504402b560

+ 20 - 0
zhongzheng-api/src/main/java/com/zhongzheng/core/config/WebSocketConfig.java

@@ -0,0 +1,20 @@
+package com.zhongzheng.core.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
+     *
+     * @return
+     */
+    @Bean
+    public ServerEndpointExporter serverEndpointExporter() {
+        return new ServerEndpointExporter();
+    }
+}

+ 0 - 3
zhongzheng-common/pom.xml

@@ -71,7 +71,6 @@
             <version>3.3.0</version>
         </dependency>
 
-
         <!-- OSS SDK 相关依赖 -->
         <dependency>
             <groupId>com.aliyun.oss</groupId>
@@ -175,13 +174,11 @@
             <groupId>de.codecentric</groupId>
             <artifactId>spring-boot-admin-starter-client</artifactId>
         </dependency>
-
         <dependency>
             <groupId>com.github.xiaoymin</groupId>
             <artifactId>knife4j-spring-boot-starter</artifactId>
         </dependency>
 
-
     </dependencies>
 
 </project>

+ 6 - 1
zhongzheng-framework/pom.xml

@@ -66,7 +66,12 @@
             <groupId>com.zhongzheng</groupId>
             <artifactId>zhongzheng-system</artifactId>
         </dependency>
+        <!-- SpringBoot Websocket -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
 
     </dependencies>
 
-</project>
+</project>

+ 1 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/SecurityConfig.java

@@ -136,6 +136,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 // Spring Boot Actuator 的安全配置
                 .antMatchers("/actuator").anonymous()
                 .antMatchers("/actuator/**").anonymous()
+                .antMatchers("/webSocket/**").anonymous()
                 // 除上面外的所有请求全部需要鉴权认证
                 .anyRequest().authenticated()
                 .and()

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassGradeStudentVo.java

@@ -144,4 +144,8 @@ public class ClassGradeStudentVo {
 	private Integer rebuy;
 	@ApiModelProperty("订单商品ID")
 	private Long orderGoodsId;
+	/** 官方信息推送接口 */
+	@Excel(name = "官方信息推送接口")
+	@ApiModelProperty("官方信息推送接口")
+	private Long interfacePushId;
 }

+ 98 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/socket/service/WebSocketServer.java

@@ -0,0 +1,98 @@
+package com.zhongzheng.modules.socket.service;
+
+import com.zhongzheng.common.exception.CustomException;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.*;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.io.IOException;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+@ServerEndpoint("/webSocket/{sid}")
+@Component
+public class WebSocketServer {
+    //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
+    private static AtomicInteger onlineNum = new AtomicInteger();
+
+    //concurrent包的线程安全Set,用来存放每个客户端对应的WebSocketServer对象。
+    private static ConcurrentHashMap<String, Session> sessionPools = new ConcurrentHashMap<>();
+
+    //发送消息
+    public void sendMessage(Session session, String message) throws IOException {
+        if(session != null){
+            synchronized (session) {
+//                System.out.println("发送数据:" + message);
+                session.getBasicRemote().sendText(message);
+            }
+        }
+    }
+    //给指定用户发送信息
+    public void sendInfo(String userName, String message){
+        Session session = sessionPools.get(userName);
+        if(session==null){
+            throw new CustomException("webSocket不在线",505);
+        }
+        try {
+            sendMessage(session, message);
+        }catch (Exception e){
+            throw new CustomException("webSocket不在线",505);
+        }
+    }
+
+    //建立连接成功调用
+    @OnOpen
+    public void onOpen(Session session, @PathParam(value = "sid") String userName){
+        if(!sessionPools.containsKey(userName)){
+            addOnlineCount();
+        }
+        sessionPools.put(userName, session);
+        System.out.println(userName + "加入webSocket!当前人数为" + onlineNum);
+        try {
+            sendMessage(session, "欢迎" + userName + "加入连接!");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    //关闭连接时调用
+    @OnClose
+    public void onClose(@PathParam(value = "sid") String userName){
+        sessionPools.remove(userName);
+        subOnlineCount();
+        System.out.println(userName + "断开webSocket连接!当前人数为" + onlineNum);
+    }
+
+    //收到客户端信息
+    @OnMessage
+    public void onMessage(String message) throws IOException{
+        message = "客户端:" + message + ",已收到";
+        System.out.println(message);
+        /*for (Session session: sessionPools.values()) {
+            try {
+                sendMessage(session, message);
+            } catch(Exception e){
+                e.printStackTrace();
+                continue;
+            }
+        }*/
+    }
+
+    //错误时调用
+    @OnError
+    public void onError(Session session, Throwable throwable){
+        System.out.println("发生错误");
+        throwable.printStackTrace();
+    }
+
+    public static void addOnlineCount(){
+        onlineNum.incrementAndGet();
+    }
+
+    public static void subOnlineCount() {
+        onlineNum.decrementAndGet();
+    }
+
+}

+ 2 - 0
zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeMapper.xml

@@ -146,6 +146,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="studyCount" column="study_count"/>
         <result property="rebuy" column="rebuy"/>
         <result property="orderGoodsId" column="order_goods_id"/>
+        <result property="interfacePushId" column="interface_push_id"/>
     </resultMap>
 
 
@@ -301,6 +302,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         (SELECT g.study_end_time FROM goods g LEFT JOIN class_grade_goods cgg on cgg.goods_id = g.goods_id where cg.grade_id = cgg.grade_id) as study_end_time,
         cg.class_start_time,
         cg.class_end_time,
+        cg.interface_push_id,
         cgu.official_status,
         cgu.learn_status,
         (SELECT COUNT(m.id) FROM course_menu_exam m LEFT JOIN goods_course c on m.course_id=c.course_id LEFT JOIN class_grade_goods cgg on cgg.goods_id = c.goods_id where cg.grade_id=cgg.grade_id and m.type = 1 ) as exam_num,