|
|
|
@ -11,6 +11,7 @@ import org.redisson.api.RedissonClient; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.stereotype.Component; |
|
|
|
|
|
|
|
import java.time.Duration; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.Date; |
|
|
|
import java.util.List; |
|
|
|
@ -42,13 +43,17 @@ public class NotifyUtil { |
|
|
|
// 构建 Redis 缓存 key(按 taskId 唯一)
|
|
|
|
String cacheKey = WARN_LOCK_KEY_PREFIX + taskId; |
|
|
|
|
|
|
|
// 核心逻辑:检查Redis缓存,存在则直接返回(1小时内已发送过)
|
|
|
|
boolean isCached = redissonClient.getBucket(cacheKey).isExists(); |
|
|
|
if (isCached) { |
|
|
|
// 核心逻辑:使用原子操作 setIfAbsent 防止并发重复发送
|
|
|
|
// 返回 true 表示成功设置(之前不存在),返回 false 表示 1 小时内已发送过
|
|
|
|
boolean acquired = redissonClient.getBucket(cacheKey).setIfAbsent( |
|
|
|
"SEND_SUCCESS", |
|
|
|
Duration.ofSeconds(WARN_LOCK_EXPIRE_SECONDS) |
|
|
|
); |
|
|
|
if (!acquired) { |
|
|
|
log.debug(">>> [算法生题 API 调用失败通知] 任务{}在 1 小时内已发送过,跳过", taskId); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
try { |
|
|
|
String now = DateUtil.now(); |
|
|
|
String markdown = String.format("### 【告警】算法生题 API 调用失败通知 \n\n") + |
|
|
|
@ -69,15 +74,14 @@ public class NotifyUtil { |
|
|
|
.build(); |
|
|
|
DtCorpConversationMsgSendResult result = dtService.getCorpConversationMsgService().send(corpConversationMessage); |
|
|
|
if (result.getErrCode() == 0) { |
|
|
|
log.info(">>> [算法生题API调用失败通知] 成功发送通知 ,考试任务ID:{} ,知识点簇ID:{}", taskId, clusterId); |
|
|
|
log.info(">>> [算法生题 API 调用失败通知] 成功发送通知,考试任务 ID:{} ,知识点簇 ID:{}", taskId, clusterId); |
|
|
|
} else { |
|
|
|
log.error(">>> [算法生题API调用失败通知] 发送失败.考试任务ID:{} ,知识点簇ID:{}, 错误码: {}, 错误信息: {}", taskId, clusterId, |
|
|
|
log.error(">>> [算法生题 API 调用失败通知] 发送失败,考试任务 ID:{} ,知识点簇 ID:{}, 错误码:{}, 错误信息:{}", taskId, clusterId, |
|
|
|
result.getErrCode(), result.getErrMsg()); |
|
|
|
} |
|
|
|
redissonClient.getBucket(cacheKey).set("SEND_SUCCESS", WARN_LOCK_EXPIRE_SECONDS, TimeUnit.SECONDS); |
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
log.error(">>> [算法生题API调用失败通知] 钉钉接口调用异常, 考试任务ID:{} ,知识点簇ID:{}, 原因: {}",taskId, clusterId, e.getMessage()); |
|
|
|
log.error(">>> [算法生题 API 调用失败通知] 钉钉接口调用异常,考试任务 ID:{} ,知识点簇 ID:{}, 原因:{}",taskId, clusterId, e.getMessage()); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|