浏览代码

Merge remote-tracking branch 'origin/master'

Joburgess 5 年之前
父节点
当前提交
b37a1a22c4

+ 6 - 0
edu-im/edu-im-server/src/main/java/com/keao/edu/im/dao/RoomMemberDao.java

@@ -18,6 +18,8 @@ import java.util.List;
 public interface RoomMemberDao extends JpaRepository<RoomMember, Long> {
     public List<RoomMember> findByRid(String rid);
 
+    public List<RoomMember> findByRidAndMsidFlag(String rid,boolean msidFlag);
+
     @Lock(value = LockModeType.PESSIMISTIC_WRITE)
     public RoomMember findByRidAndUid(String rid, String uid);
 
@@ -40,6 +42,10 @@ public interface RoomMemberDao extends JpaRepository<RoomMember, Long> {
     public int updateRoleByRidAndUid(String rid, String uid, int role);
 
     @Modifying
+    @Query(value = "update rongyun_room_member set msid_flag=?3 where rid=?1 and uid=?2", nativeQuery = true)
+    public int updateMsidByRidAndUid(String rid, String uid,boolean msid);
+
+    @Modifying
     @Query(value = "update rongyun_room_member set role=?3 where rid=?1 and role=?2", nativeQuery = true)
     public int updateRoleByRidAndRole(String rid, int role);
 

+ 44 - 43
edu-im/edu-im-server/src/main/java/com/keao/edu/im/mec/im/IMHelper.java

@@ -235,23 +235,17 @@ public class IMHelper {
      * 开始录制
      * @param roomId
      * @param registrationId
-     * @param roomMembers
      * @return
      * @throws Exception
      */
-    public void startRecord(String roomId, Long registrationId, List<RoomMember> roomMembers) throws Exception {
+    public void startRecord(String roomId, Long registrationId, String msid) throws Exception {
         if (roomId == null) {
             throw new IllegalArgumentException("Paramer 'roomId' is required");
         }
 
         JSONObject paramJson = new JSONObject();
 
-        String sessionId = redisTemplate.opsForValue().get("sessionId:" + roomId);
-        if(StringUtils.isEmpty(sessionId)){
-            sessionId = roomQuery(roomId);
-            redisTemplate.opsForValue().set("sessionId:" + roomId,sessionId);
-        }
-        paramJson.put("sessionId",sessionId);
+        paramJson.put("sessionId",roomQuery(roomId));
 //        paramJson.put("sessionId",roomQuery(roomId));
 
         JSONObject config = new JSONObject();
@@ -267,16 +261,19 @@ public class IMHelper {
 
 //        config.put("input",getInput(roomMembers));
 //        paramJson.put("config",config);
-        againRecord(paramJson,registrationId,roomId,config);
+        againRecord(paramJson,registrationId,roomId,config,msid);
     }
 
     @Async
-    public void againRecord(JSONObject paramJson,Long registrationId,String roomId,JSONObject config) throws Exception {
-        List<RoomMember> roomMembers = roomMemberDao.findByRid(roomId);
+    public void againRecord(JSONObject paramJson,Long registrationId,String roomId,JSONObject config,String msid) throws Exception {
+        List<RoomMember> roomMembers = roomMemberDao.findByRidAndMsidFlag(roomId,true);
         if (roomMembers == null || roomMembers.size() == 0) {
             throw new IllegalArgumentException("Paramer 'roomMembers' is can not be null");
         }
-        config.put("input",getInput(roomMembers));
+        if(StringUtils.isEmpty(msid)){
+            return;
+        }
+        config.put("input",getInput(roomMembers,msid));
         paramJson.put("config",config);
         String body = paramJson.toJSONString();
         HttpURLConnection conn = httpHelper.createIMRtcPostHttpConnection("/rtc/record/start.json", "application/json",roomId);
@@ -289,11 +286,11 @@ public class IMHelper {
             int i = 1;
             while (i<=3){
                 Thread.sleep(5000l);
-                List<RoomMember> members = roomMemberDao.findByRid(roomId);
+                List<RoomMember> members = roomMemberDao.findByRidAndMsidFlag(roomId,true);
                 if (members == null || members.size() == 0) {
                     throw new IllegalArgumentException("Paramer 'roomMembers' is can not be null");
                 }
-                config.put("input",getInput(members));
+                config.put("input",getInput(roomMembers,msid));
                 paramJson.put("config",config);
                 body = paramJson.toJSONString();
                 HttpURLConnection connection = httpHelper.createIMRtcPostHttpConnection("/rtc/record/start.json", "application/json", roomId);
@@ -303,7 +300,7 @@ public class IMHelper {
                 i++;
                 if(imApiResultInfo.getResultCode() == 10000){
                     redisTemplate.opsForValue().set(imApiResultInfo.getRecordId(),registrationId.toString());
-                    log.info("直播视频录制成功:第{}次重试",i);
+                    log.info("直播视频录制第{}次重试成功",i);
                     return;
                 }
                 if(i > 3){
@@ -322,27 +319,25 @@ public class IMHelper {
      * @throws Exception
      */
     @Async
-    public IMApiResultInfo configRecord(String roomId, List<RoomMember> roomMembers) throws Exception {
+    public IMApiResultInfo configRecord(String roomId, List<RoomMember> roomMembers,String msid) throws Exception {
         if (roomId == null) {
             throw new IllegalArgumentException("Paramer 'roomId' is required");
         }
         if (roomMembers == null || roomMembers.size() == 0) {
             throw new IllegalArgumentException("Paramer 'roomMembers' is can not be null");
         }
-        JSONObject paramJson = new JSONObject();
-        String sessionId = redisTemplate.opsForValue().get("sessionId:" + roomId);
-        if(StringUtils.isEmpty(sessionId)){
-            sessionId = roomQuery(roomId);
-            redisTemplate.opsForValue().set("sessionId:" + roomId,sessionId);
+        if(StringUtils.isEmpty(msid)){
+            throw new IllegalArgumentException("调整录制布局失败:获取流失败");
         }
-        paramJson.put("sessionId",sessionId);
+        JSONObject paramJson = new JSONObject();
+        paramJson.put("sessionId",roomQuery(roomId));
 //        paramJson.put("sessionId",roomQuery(roomId));
         paramJson.put("mixLayout",1);
         paramJson.put("renderMode",1);
         paramJson.put("hostUserId","");
         paramJson.put("hostStreamId","");
 
-        paramJson.put("input",getInput(roomMembers));
+        paramJson.put("input",getInput(roomMembers,msid));
         String body = paramJson.toJSONString();
 
         HttpURLConnection conn = httpHelper.createIMRtcPostHttpConnection("/rtc/record/config.json", "application/json",roomId);
@@ -351,7 +346,7 @@ public class IMHelper {
         return resultInfo;
     }
 
-    private JSONObject getInput(List<RoomMember> roomMembers){
+    private JSONObject getInput(List<RoomMember> roomMembers,String msid){
 
         JSONArray videos = new JSONArray();
         boolean isMaster = true;
@@ -363,7 +358,7 @@ public class IMHelper {
             RoomMember roomMember = roomMembers.get(i);
             JSONObject video = new JSONObject();
             video.put("userId",roomMember.getUid());
-            video.put("streamId",roomMember.getUid() + "_RongCloudRTC");
+            video.put("streamId",msid);
             if((roomMember.getRole() == 3 && isMaster) || (i == size - 1 && isMaster) || (i == 5 && isMaster)){
                 video.put("x",0);
                 video.put("y",0);
@@ -405,19 +400,14 @@ public class IMHelper {
             throw new IllegalArgumentException("Paramer 'roomId' is required");
         }
         JSONObject paramJson = new JSONObject();
-        String sessionId = redisTemplate.opsForValue().get("sessionId:" + roomId);
-        if(StringUtils.isEmpty(sessionId)){
-            sessionId = roomQuery(roomId);
-            redisTemplate.opsForValue().set("sessionId:" + roomId,sessionId);
-        }
-        paramJson.put("sessionId",sessionId);
+        paramJson.put("sessionId",roomQuery(roomId));
 //        paramJson.put("sessionId",roomQuery(roomId));
 
         String body = paramJson.toJSONString();
 
         HttpURLConnection conn = httpHelper.createIMRtcPostHttpConnection("/rtc/record/stop.json", "application/json",roomId);
         httpHelper.setBodyParameter(body, conn);
-
+        redisTemplate.delete("sessionId:" + roomId);
         return JSON.parseObject(httpHelper.returnResult(conn, body), IMApiResultInfo.class);
     }
 
@@ -427,24 +417,35 @@ public class IMHelper {
      * @return
      * @throws Exception
      */
-    public String roomQuery(String roomId) throws Exception {
+    public String roomQuery(String roomId){
         if (StringUtils.isEmpty(roomId)) {
             throw new IllegalArgumentException("Paramer 'roomId' is required");
         }
+        String sessionId = redisTemplate.opsForValue().get("sessionId:" + roomId);
+        if(StringUtils.isNotEmpty(sessionId)){
+            return sessionId;
+        }
         JSONObject jsonObject = new JSONObject();
         jsonObject.put("roomId",roomId);
 
-        HttpURLConnection conn = httpHelper.createIMRtcPostHttpConnection("/rtc/room/query.json", "application/json",null);
-        httpHelper.setBodyParameter(jsonObject.toJSONString(), conn);
-        String returnResult = httpHelper.returnResult(conn, jsonObject.toJSONString());
-        JSONObject resultObject = JSONObject.parseObject(returnResult);
-        String code = resultObject.get("code").toString();
-        if("200".equals(code)){
-            return resultObject.get("sessionId").toString();
-        }else {
-            log.error("获取sessionId失败 returnResult:{}",returnResult);
-            throw new BizException("获取sessionId失败");
+        HttpURLConnection conn = null;
+        try {
+            conn = httpHelper.createIMRtcPostHttpConnection("/rtc/room/query.json", "application/json",null);
+            httpHelper.setBodyParameter(jsonObject.toJSONString(), conn);
+            String returnResult = httpHelper.returnResult(conn, jsonObject.toJSONString());
+            JSONObject resultObject = JSONObject.parseObject(returnResult);
+            String code = resultObject.get("code").toString();
+            if("200".equals(code)){
+                sessionId = resultObject.get("sessionId").toString();
+                redisTemplate.opsForValue().set("sessionId:" + roomId,sessionId);
+            }else {
+                log.error("获取sessionId失败 returnResult:{}",returnResult);
+                throw new BizException("获取sessionId失败");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
         }
+        return sessionId;
     }
 
 

+ 1 - 0
edu-im/edu-im-server/src/main/java/com/keao/edu/im/pojo/RoomMember.java

@@ -27,6 +27,7 @@ public class RoomMember {
     private @Getter @Setter boolean musicMode = true;
     private @Getter @Setter boolean mic = true;
     private @Getter @Setter boolean hand = false;
+    private @Getter @Setter boolean msidFlag = false;
 
     public RoomMember() {
     }

+ 24 - 7
edu-im/edu-im-server/src/main/java/com/keao/edu/im/service/Impl/RoomServiceImpl.java

@@ -1,5 +1,7 @@
 package com.keao.edu.im.service.Impl;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.keao.edu.auth.api.client.SysUserFeignService;
 import com.keao.edu.auth.api.entity.SysUser;
 import com.keao.edu.common.exception.BizException;
@@ -76,7 +78,7 @@ public class RoomServiceImpl implements RoomService {
     }
 
     @Transactional(rollbackFor = Exception.class, isolation = Isolation.SERIALIZABLE)
-    public void joinRoomSuccess(Long registrationId,String roomId,String userId) throws Exception {
+    public void joinRoomSuccess(Long registrationId,String roomId,String userId,String msid) throws Exception {
         StudentExamResultApiDto examResult = null;
         log.info("joinRoomSuccess: roomId={}, isAudience={}, isDisableCamera={},isMusicMode={}", roomId);
 
@@ -158,10 +160,10 @@ public class RoomServiceImpl implements RoomService {
             }
             this.publishMessage(eduUserFeignService.getPublishMessage(registrationId));
             eduUserFeignService.upsetStudentAttendance(registrationId,0);
-            imHelper.startRecord(roomId, registrationId,roomMembers);
+            imHelper.startRecord(roomId, registrationId,msid);
         }else {
             eduUserFeignService.upsetTeacherAttendance(examRoom.getId(),sysUser.getId(),0);
-            imHelper.configRecord(roomId,roomMembers);
+            imHelper.configRecord(roomId,roomMembers,msid);
         }
     }
 
@@ -284,7 +286,7 @@ public class RoomServiceImpl implements RoomService {
     }
 
     @Transactional(rollbackFor = Exception.class, isolation = Isolation.SERIALIZABLE)
-    public void leaveRoomSuccess(Long registrationId,String roomId,String userId) throws Exception {
+    public void leaveRoomSuccess(Long registrationId,String roomId,String userId,String msid) throws Exception {
         if(registrationId != null){
             StudentExamResultApiDto examResult = eduUserFeignService.getExamResult(registrationId);
             roomId = examResult.getRoomId();
@@ -325,7 +327,7 @@ public class RoomServiceImpl implements RoomService {
             imHelper.stopRecord(roomId);
         }else {
             eduUserFeignService.upsetTeacherAttendance(Long.parseLong(roomId),Integer.parseInt(userId),1);
-            imHelper.configRecord(roomId,roomMemberDao.findByRid(roomId));
+            imHelper.configRecord(roomId,roomMemberDao.findByRidAndMsidFlag(roomId,true),msid);
         }
     }
 
@@ -1264,6 +1266,19 @@ public class RoomServiceImpl implements RoomService {
         String userId = notify.getUserId();
         RoomMember roomMember = roomMemberDao.findByRidAndUid(roomId, userId);
         log.info("statusSync roomMember:{}",roomMember);
+        String msidStr = null;
+        boolean msidFlag = false;
+        List<Member> members = notify.getMembers();
+        if(members != null && members.size() != 0){
+            JSONArray jsonArray = JSONObject.parseArray(JSONObject.toJSONString(members.get(0).getData().get("uris")));
+            if(jsonArray != null && !jsonArray.isEmpty()){
+                Object msid = JSONObject.parseObject(JSONObject.toJSONString(jsonArray.get(0))).get("msid");
+                if(msid != null){
+                    msidStr = msid.toString();
+                    msidFlag = true;
+                }
+            }
+        }
         if(roomMember == null){
             return false;
         }
@@ -1276,10 +1291,12 @@ public class RoomServiceImpl implements RoomService {
             redisTemplate.delete("sessionId:" + roomId);
         }else if(notify.getEvent() == 11){
             //成员加入
-            joinRoomSuccess(roomMember.getExamRegistrationId(),roomId,userId);
+            roomMemberDao.updateMsidByRidAndUid(roomId,userId,msidFlag);
+            joinRoomSuccess(roomMember.getExamRegistrationId(),roomId,userId,msidStr);
         }else if(notify.getEvent() == 12){
             //成员退出
-            leaveRoomSuccess(roomMember.getExamRegistrationId(),roomId,userId);
+            roomMemberDao.updateMsidByRidAndUid(roomId,userId,msidFlag);
+            leaveRoomSuccess(roomMember.getExamRegistrationId(),roomId,userId,msidStr);
         }else if(notify.getEvent() == 20){
             //资源发生变动
         }