Ver código fonte

催课内容为空 没查询到来源添加控检查 IM 添加重试机制

xgb 1 semana atrás
pai
commit
cbef7733d0

+ 46 - 7
fs-admin/src/main/java/com/fs/his/task/Task.java

@@ -1678,12 +1678,35 @@ public class Task {
             return;
         }
         for (Map.Entry<String, BatchSendCourseAllDTO> entry : toSendMap) {
+            String key=entry.getKey();
             //执行发送消息任务
             BatchSendCourseAllDTO batchSendCourseAllDTO = entry.getValue();
-            openIMService.batchSendCourseTask(batchSendCourseAllDTO.getBatchSendCourseDTO(), batchSendCourseAllDTO.getOpenImBatchMsgDTO(), batchSendCourseAllDTO.getProject(), batchSendCourseAllDTO.getImMsgSendDetailList());
+            OpenImBatchMsgDTO openImBatchMsgDTO = batchSendCourseAllDTO.getOpenImBatchMsgDTO();
+            Integer nowCount=openImBatchMsgDTO.getCount();
+            OpenImResponseDTO responseDTO=new OpenImResponseDTO();
+            try {
+                 responseDTO=  openIMService.batchSendCourseTask(batchSendCourseAllDTO.getBatchSendCourseDTO(), batchSendCourseAllDTO.getOpenImBatchMsgDTO(), batchSendCourseAllDTO.getProject(), batchSendCourseAllDTO.getImMsgSendDetailList());
+            } catch (Exception e) {
+                e.printStackTrace();
+            }finally {
+
+                if(nowCount<3){ // 重试三次后放弃
+                    logger.error("重试三次后放弃,key{}", entry.getKey());
+                    redisTemplate.opsForHash().delete(redisKey, entry.getKey());
+                }
+
+                if(responseDTO!=null && responseDTO.getErrCode() == 0){
+                    // 执行结束,删除
+                    redisTemplate.opsForHash().delete(redisKey, entry.getKey());
+                }else {
+                    openImBatchMsgDTO.setCount(openImBatchMsgDTO.getCount() + 1);// 次数加一
+                    batchSendCourseAllDTO.setOpenImBatchMsgDTO(openImBatchMsgDTO);
+                    // 错误更新次数 重新放入redis中
+                    redisTemplate.opsForHash().put(redisKey, key, batchSendCourseAllDTO);
+                }
+            }
+
 
-            // 执行结束,删除
-            this.redisTemplate.<String, BatchSendCourseAllDTO>opsForHash().delete(redisKey, entry.getKey());
 
         }
 
@@ -1711,17 +1734,33 @@ public class Task {
             return;
         }
         for (Map.Entry<String, BatchSendCourseAllDTO> entry : toSendMap) {
+            String key=entry.getKey();
             //执行发送消息任务
             BatchSendCourseAllDTO batchSendCourseAllDTO = entry.getValue();
+            OpenImBatchMsgDTO openImBatchMsgDTO = batchSendCourseAllDTO.getOpenImBatchMsgDTO();
+            Integer nowCount=openImBatchMsgDTO.getCount();
+            OpenImResponseDTO responseDTO=new OpenImResponseDTO();
             try {
                 openIMService.batchUrgeCourseTask(batchSendCourseAllDTO.getOpenImBatchMsgDTO(), batchSendCourseAllDTO.getImMsgSendDetailList());
             }catch (Exception e){
                 e.printStackTrace();
-                continue;
-            }
-            // 执行结束,删除
-            this.redisTemplate.<String, BatchSendCourseAllDTO>opsForHash().delete(redisKey, entry.getKey());
+            }finally {
 
+                if(nowCount<3){ // 重试三次后放弃
+                    logger.error("重试三次后放弃,key{}", entry.getKey());
+                    redisTemplate.opsForHash().delete(redisKey, entry.getKey());
+                }
+
+                if(responseDTO!=null && responseDTO.getErrCode() == 0){
+                    // 执行结束,删除
+                    redisTemplate.opsForHash().delete(redisKey, entry.getKey());
+                }else {
+                    openImBatchMsgDTO.setCount(openImBatchMsgDTO.getCount() + 1);// 次数加一
+                    batchSendCourseAllDTO.setOpenImBatchMsgDTO(openImBatchMsgDTO);
+                    // 错误更新次数 重新放入redis中
+                    redisTemplate.opsForHash().put(redisKey, key, batchSendCourseAllDTO);
+                }
+            }
         }
     }
 

+ 3 - 0
fs-service/src/main/java/com/fs/im/domain/FsImMsgSendLog.java

@@ -103,4 +103,7 @@ public class FsImMsgSendLog extends BaseEntity{
     @Excel(name = "营期课程表id")
     private Long periodDaysId;
 
+    // 重发次数
+    private Integer count;
+
 }

+ 3 - 0
fs-service/src/main/java/com/fs/im/dto/OpenImBatchMsgDTO.java

@@ -29,6 +29,9 @@ public class OpenImBatchMsgDTO implements Serializable {
     private String ex;
     private Boolean isSendAll; //是否发送给全部人
 
+    // 发送失败次数 重试三次 失败后不再发送
+    private Integer count = 0;
+
 
     @Data
     public static class Content implements Serializable {

+ 15 - 1
fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java

@@ -1078,7 +1078,14 @@ public class OpenIMServiceImpl implements OpenIMService {
                 .execute()
                 .body();
         log.info("批量发送消息返回内容:\n{}", result);
-        OpenImResponseDTO responseDTO= JSONUtil.toBean(result, OpenImResponseDTO.class);
+        OpenImResponseDTO responseDTO=new OpenImResponseDTO();
+        if (result != null && result.startsWith("<html")) {
+            log.error("网关超时返回HTML报文: {}", result);
+            responseDTO.setErrCode(502);
+            responseDTO.setErrMsg("网关超时");
+            return responseDTO;
+        }
+        responseDTO= JSONUtil.toBean(result, OpenImResponseDTO.class);
         return responseDTO;
     }
 
@@ -1193,7 +1200,13 @@ public class OpenIMServiceImpl implements OpenIMService {
 //            extension.setSendTime(batchSendCourseDTO.getUrgeTime() != null ? batchSendCourseDTO.getUrgeTime() : new Date());
             OpenImBatchMsgDTO.Content content = new OpenImBatchMsgDTO.Content();
             content.setContent(batchSendCourseDTO.getUrgeContent());
+            if(StringUtils.isEmpty(batchSendCourseDTO.getUrgeContent())){
+                // 排查不到来源content为空
+                log.info("催课内容不存在:{}",batchSendCourseDTO);
+                throw new RuntimeException("请填写催课内容");
+            }
             openImBatchMsgDTO.setContent(content);
+
             openImBatchMsgDTO.setContentType(101);
             openImBatchMsgDTO.setSendTime(batchSendCourseDTO.getUrgeTime() != null ? batchSendCourseDTO.getUrgeTime().getTime() : System.currentTimeMillis());
         }
@@ -1472,6 +1485,7 @@ public class OpenIMServiceImpl implements OpenIMService {
         fsImMsgSendLog.setLogId(imMsgSendDetailList.get(0).getLogId());
         fsImMsgSendLog.setSendStatus(1);
         fsImMsgSendLog.setUpdateTime(new Date());
+        fsImMsgSendLog.setCount(openImBatchMsgDTO.getCount());
         fsImMsgSendLogMapper.updateById(fsImMsgSendLog);
 //        }
     }