fix:邮件服务器管理同步

This commit is contained in:
nieziyan 2024-01-04 15:55:17 +08:00
parent 668a5d50ad
commit 0be1f3e7fd
12 changed files with 58 additions and 45 deletions

View File

@ -1,17 +0,0 @@
package org.jeecg.common;
import org.jeecg.common.util.RedisUtil;
import org.jeecg.common.util.SpringContextUtils;
import org.jeecg.common.util.TokenUtils;
public class TokenContext implements AutoCloseable{
private final ThreadLocal<String> userToken = new ThreadLocal<>();
public void setToken() {
userToken.set(TokenUtils.getTempToken());
}
@Override
public void close() throws Exception { userToken.remove(); }
}

View File

@ -76,6 +76,9 @@ public class AlarmRule implements Serializable {
@TableField(value = "item_id") @TableField(value = "item_id")
private String itemId; private String itemId;
@TableField("item_type")
private String itemType;
/** /**
* 创建时间 * 创建时间
*/ */

View File

@ -4,8 +4,11 @@ import cn.hutool.core.util.ObjectUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
@Slf4j @Slf4j
@Component @Component
@ -15,7 +18,7 @@ public class IDCDataFetch {
private TemplateManager templateManager; private TemplateManager templateManager;
// 定时拾取IDC数据 // 定时拾取IDC数据
//@Scheduled(initialDelay = 5, fixedDelay = 10, timeUnit = TimeUnit.SECONDS) // @Scheduled(initialDelay = 5, fixedDelay = 10, timeUnit = TimeUnit.SECONDS)
public void fetch() { public void fetch() {
try { try {
JdbcTemplate template = templateManager.getTemplate(); JdbcTemplate template = templateManager.getTemplate();

View File

@ -1,12 +1,11 @@
package org.jeecg.modules.idc; package org.jeecg.modules.idc;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import feign.FeignException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.TokenContext;
import org.jeecg.common.api.dto.message.MessageDTO; import org.jeecg.common.api.dto.message.MessageDTO;
import org.jeecg.common.config.mqtoken.UserTokenContext;
import org.jeecg.common.constant.enums.MessageTypeEnum; import org.jeecg.common.constant.enums.MessageTypeEnum;
import org.jeecg.common.util.JDBCUtil; import org.jeecg.common.util.JDBCUtil;
import org.jeecg.common.util.TokenUtils;
import org.jeecg.modules.base.dto.ConnR; import org.jeecg.modules.base.dto.ConnR;
import org.jeecg.modules.feignclient.SystemClient; import org.jeecg.modules.feignclient.SystemClient;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -14,6 +13,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.annotation.Schedules;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.HashMap; import java.util.HashMap;
@ -67,7 +67,7 @@ public class TemplateManager {
* */ * */
// @Scheduled(fixedDelay = 10, timeUnit = TimeUnit.SECONDS) // @Scheduled(fixedDelay = 10, timeUnit = TimeUnit.SECONDS)
private void checkTemplate(){ private void checkTemplate(){
try (TokenContext tokenContext = new TokenContext()){ try {
MessageDTO messageDTO = new MessageDTO(null, IDC_DATASOURCE_STATUS.getCode(), "admin"); MessageDTO messageDTO = new MessageDTO(null, IDC_DATASOURCE_STATUS.getCode(), "admin");
messageDTO.setType(MessageTypeEnum.XT.getType()); messageDTO.setType(MessageTypeEnum.XT.getType());
ConnR connR = JDBCUtil.isConnection(urlM, usernameM, passwordM); ConnR connR = JDBCUtil.isConnection(urlM, usernameM, passwordM);
@ -78,8 +78,7 @@ public class TemplateManager {
this.setTemplate(template); this.setTemplate(template);
} else { } else {
// 为当前线程设置临时Token 避免OpenFeign调用其它服务接口时401 // 为当前线程设置临时Token 避免OpenFeign调用其它服务接口时401
tokenContext.setToken(); UserTokenContext.setToken(TokenUtils.getTempToken());
// 给admin发送数据源异常消息 // 给admin发送数据源异常消息
Map<String, Object> data = new HashMap<>(); Map<String, Object> data = new HashMap<>();
data.put("param1", "inland"); data.put("param1", "inland");
@ -102,6 +101,8 @@ public class TemplateManager {
} }
}catch (Exception e){ }catch (Exception e){
log.error("定时检查inland/oversea数据源状态异常: {}", e.getMessage()); log.error("定时检查inland/oversea数据源状态异常: {}", e.getMessage());
}finally {
UserTokenContext.remove();
} }
} }
} }

View File

@ -3,6 +3,7 @@ package org.jeecg.modules.service.impl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.ListUtil; import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
@ -14,6 +15,7 @@ import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.constant.Prompt; import org.jeecg.common.constant.Prompt;
import org.jeecg.common.constant.RedisConstant; import org.jeecg.common.constant.RedisConstant;
import org.jeecg.common.constant.SymbolConstant; import org.jeecg.common.constant.SymbolConstant;
import org.jeecg.common.util.NumUtil;
import org.jeecg.common.util.RedisStreamUtil; import org.jeecg.common.util.RedisStreamUtil;
import org.jeecg.common.util.RedisUtil; import org.jeecg.common.util.RedisUtil;
import org.jeecg.modules.base.dto.AlarmRuleDto; import org.jeecg.modules.base.dto.AlarmRuleDto;
@ -105,7 +107,10 @@ public class AlarmRuleServiceImpl extends ServiceImpl<AlarmRuleMapper, AlarmRule
} }
boolean success = updateById(alarmRule); boolean success = updateById(alarmRule);
if (success){ if (success){
updateRule(ruleId, sourceTypeOld); // 如果当前规则是生效状态 则将修改后的规则同步到Redis
Integer enabled = alarmRuleOld.getEnabled();
if (Enabled.valueOf(enabled) == ENABLED)
updateRule(ruleId, sourceTypeOld);
return Result.OK(Prompt.UPDATE_SUCC); return Result.OK(Prompt.UPDATE_SUCC);
} }
return Result.error(Prompt.UPDATE_ERR); return Result.error(Prompt.UPDATE_ERR);

View File

@ -16,7 +16,7 @@ public interface MonitorSystem {
@PostMapping("/sys/login") @PostMapping("/sys/login")
Result<LoginResult> login(@RequestBody LoginVo loginVo); Result<LoginResult> login(@RequestBody LoginVo loginVo);
@GetMapping("queryItemHistory") @GetMapping("/omms/device/monitor/queryItemHistory")
Result<ItemHistory> itemBack(@RequestParam String itemId, Result<ItemHistory> itemBack(@RequestParam String itemId,
@RequestParam Integer itemType, @RequestParam Integer itemType,
@RequestParam String start, @RequestParam String start,

View File

@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.sun.mail.smtp.SMTPAddressFailedException; import com.sun.mail.smtp.SMTPAddressFailedException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.jdom2.output.support.WalkerNORMALIZE;
import org.jeecg.common.api.dto.message.MessageDTO; import org.jeecg.common.api.dto.message.MessageDTO;
import org.jeecg.common.email.EmailServiceManager; import org.jeecg.common.email.EmailServiceManager;
import org.jeecg.modules.base.entity.postgre.SysEmail; import org.jeecg.modules.base.entity.postgre.SysEmail;
@ -41,8 +42,15 @@ public class EmailPushMsgHandle implements ISendMsgHandle {
public void sendMessage(MessageDTO messageDTO) { public void sendMessage(MessageDTO messageDTO) {
// 获取邮件发送服务器信息 // 获取邮件发送服务器信息
SysEmail sender = abnormalAlarmClient.getSender().getResult(); SysEmail sender = abnormalAlarmClient.getSender().getResult();
if(ObjectUtil.isNull(sender)) if(ObjectUtil.isNull(sender)){
log.error("没有可用的发件邮箱服务"); String title = "配置邮箱发件服务器提醒";
String warnInfo = "系统当前没有配置邮箱发件服务器, 发送邮件功能暂不可用!";
MessageDTO warn = new MessageDTO(title, warnInfo).setToUser("admin");
systemSendMsg.sendMessage(warn);
log.error(warnInfo);
return;
}
// 初始化邮件服务 // 初始化邮件服务
EmailServiceManager emailService = getInstance(); EmailServiceManager emailService = getInstance();
emailService.init(sender); emailService.init(sender);
@ -52,8 +60,9 @@ public class EmailPushMsgHandle implements ISendMsgHandle {
String title = messageDTO.getTitle(); String title = messageDTO.getTitle();
String context = messageDTO.getContent(); String context = messageDTO.getContent();
String alarmTitle = "邮件发送失败提醒"; String alarmTitle = "邮件发送失败提醒";
String alarmContext = "系统给您发送的邮件[标题:"+ title + StringBuilder alarmContext = new StringBuilder();
", 内容:" + context + "]发送失败,失败原因:"; alarmContext.append("系统给您发送的邮件 [标题: ").append(title)
.append(", 内容: ").append(context).append("]发送失败,失败原因: ");
// 循环给每一个用户发送邮件 // 循环给每一个用户发送邮件
for (Map.Entry<String, String> userEmails : messageDTO.getUserEmail().entrySet()) { for (Map.Entry<String, String> userEmails : messageDTO.getUserEmail().entrySet()) {
String username = userEmails.getKey(); String username = userEmails.getKey();
@ -63,19 +72,18 @@ public class EmailPushMsgHandle implements ISendMsgHandle {
emailService.sendMailToOne(messageDTO); emailService.sendMailToOne(messageDTO);
} catch (MessagingException e) { } catch (MessagingException e) {
if (e instanceof SMTPAddressFailedException) { // 无效的电子邮箱异常 if (e instanceof SMTPAddressFailedException) { // 无效的电子邮箱异常
alarmContext += "无效的电子邮箱 " + email; alarmContext.append("无效的电子邮箱: ").append(email);
} else if (e instanceof SendFailedException) { // 邮件发送失败异常 } else if (e instanceof SendFailedException) { // 邮件发送失败异常
alarmContext += e.getMessage(); alarmContext.append(e.getMessage());
} }
// 邮件发送失败 给用户发送站内提示消息 // 邮件发送失败 给用户发送站内提示消息
MessageDTO sysMsg = new MessageDTO(); MessageDTO sysMsg = new MessageDTO();
sysMsg.setToUser(username); sysMsg.setToUser(username);
sysMsg.setTitle(alarmTitle); sysMsg.setTitle(alarmTitle);
sysMsg.setContent(alarmContext); sysMsg.setContent(alarmContext.toString());
systemSendMsg.sendMessage(sysMsg); systemSendMsg.sendMessage(sysMsg);
} }
} }
sysMessageService.add(messageDTO); sysMessageService.add(messageDTO);
} }

View File

@ -27,7 +27,7 @@ import java.util.Date;
@Component("systemSendMsgHandle") @Component("systemSendMsgHandle")
public class SystemSendMsgHandle implements ISendMsgHandle { public class SystemSendMsgHandle implements ISendMsgHandle {
public static final String FROM_USER = "system"; public static final String FROM_USER = "admin";
@Resource @Resource
private WebSocket webSocket; private WebSocket webSocket;

View File

@ -39,6 +39,7 @@ public abstract class Monitor {
sendMessage = SpringContextUtils.getBean(SendMessage.class); sendMessage = SpringContextUtils.getBean(SendMessage.class);
redisStreamUtil = SpringContextUtils.getBean(RedisStreamUtil.class); redisStreamUtil = SpringContextUtils.getBean(RedisStreamUtil.class);
alarmClient = SpringContextUtils.getBean(AbnormalAlarmClient.class); alarmClient = SpringContextUtils.getBean(AbnormalAlarmClient.class);
monitorSystem = SpringContextUtils.getBean(MonitorSystem.class);
} }
protected void destroy() { protected void destroy() {

View File

@ -1,9 +1,9 @@
package org.jeecg.modules.quartz.job; package org.jeecg.modules.quartz.job;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.TokenContext;
import org.jeecg.common.config.mqtoken.UserTokenContext; import org.jeecg.common.config.mqtoken.UserTokenContext;
import org.jeecg.common.util.SpringContextUtils; import org.jeecg.common.util.SpringContextUtils;
import org.jeecg.common.util.TokenUtils;
import org.jeecg.modules.feignclient.AbnormalAlarmClient; import org.jeecg.modules.feignclient.AbnormalAlarmClient;
import org.quartz.*; import org.quartz.*;
@ -23,12 +23,14 @@ public class NuclideParamJob implements Job {
@Override @Override
public void execute(JobExecutionContext context) throws JobExecutionException { public void execute(JobExecutionContext context) throws JobExecutionException {
try (TokenContext tokenContext = new TokenContext()){ try {
tokenContext.setToken(); UserTokenContext.setToken(TokenUtils.getTempToken());
AbnormalAlarmClient alarmClient = SpringContextUtils.getBean(AbnormalAlarmClient.class); AbnormalAlarmClient alarmClient = SpringContextUtils.getBean(AbnormalAlarmClient.class);
alarmClient.refreshParam(); alarmClient.refreshParam();
}catch (Exception e){ }catch (Exception e){
log.error("定时任务[NuclideParamJob]执行异常: {}", e.getMessage()); log.error("定时任务[NuclideParamJob]执行异常: {}", e.getMessage());
}finally {
UserTokenContext.remove();
} }
} }
} }

View File

@ -1,18 +1,16 @@
package org.jeecg.modules.quartz.job; package org.jeecg.modules.quartz.job;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.TokenContext;
import org.jeecg.common.config.mqtoken.UserTokenContext; import org.jeecg.common.config.mqtoken.UserTokenContext;
import org.jeecg.common.constant.DateConstant; import org.jeecg.common.constant.DateConstant;
import org.jeecg.common.util.SpringContextUtils; import org.jeecg.common.util.SpringContextUtils;
import org.jeecg.common.util.TokenUtils;
import org.jeecg.modules.feignclient.AbnormalAlarmClient; import org.jeecg.modules.feignclient.AbnormalAlarmClient;
import org.quartz.*; import org.quartz.*;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import static org.jeecg.common.util.TokenUtils.getTempToken;
/** /**
* 此处的同步是指:当定时任务的执行时间大于任务的时间 * 此处的同步是指:当定时任务的执行时间大于任务的时间
* 间隔时会等待第一个任务执行完成才会走第二个任务 * 间隔时会等待第一个任务执行完成才会走第二个任务
@ -28,13 +26,15 @@ public class NucliedAvgJob implements Job {
@Override @Override
public void execute(JobExecutionContext context) throws JobExecutionException { public void execute(JobExecutionContext context) throws JobExecutionException {
try (TokenContext tokenContext = new TokenContext()){ try {
tokenContext.setToken(); UserTokenContext.setToken(TokenUtils.getTempToken());
AbnormalAlarmClient alarmClient = SpringContextUtils.getBean(AbnormalAlarmClient.class); AbnormalAlarmClient alarmClient = SpringContextUtils.getBean(AbnormalAlarmClient.class);
alarmClient.calculateConc(); alarmClient.calculateConc();
log.info(log()); log.info(log());
}catch (Exception e){ }catch (Exception e){
log.error("定时任务[NucliedAvgJob]执行异常: {}", e.getMessage()); log.error("定时任务[NucliedAvgJob]执行异常: {}", e.getMessage());
}finally {
UserTokenContext.remove();
} }
} }

View File

@ -72,6 +72,8 @@ public class ServerJob extends Monitor implements Job {
operator = alarmRule.getOperator(); operator = alarmRule.getOperator();
String ruleId = alarmRule.getId(); String ruleId = alarmRule.getId();
String itemId = alarmRule.getItemId(); String itemId = alarmRule.getItemId();
String type = alarmRule.getItemType();
Integer itemType = StrUtil.isBlank(type) ? 0 : Integer.parseInt(type);
String silenceKey = prefixSilence + ruleId; String silenceKey = prefixSilence + ruleId;
boolean hasKey = getRedisStreamUtil().hasKey(silenceKey); boolean hasKey = getRedisStreamUtil().hasKey(silenceKey);
boolean blank1 = StrUtil.isBlank(operator); boolean blank1 = StrUtil.isBlank(operator);
@ -85,8 +87,13 @@ public class ServerJob extends Monitor implements Job {
// 向运管查询监控项数据 // 向运管查询监控项数据
String token = ManageUtil.getToken(); String token = ManageUtil.getToken();
Result<ItemHistory> result = getMonitorSystem().itemBack(itemId, 0, start, end, token); Result<ItemHistory> result = getMonitorSystem().itemBack(itemId, itemType, start, end, token);
Double current = result.getResult().getNow(); ItemHistory itemHistory = result.getResult();
if (ObjectUtil.isNull(itemHistory)){
log.warn("Server监控异常: [{}]查询监控项历史数据为空", serverName);
continue;
}
Double current = itemHistory.getNow();
// 解析预警规则,判断是否需要报警 // 解析预警规则,判断是否需要报警
ObjectMapper mapper = new ObjectMapper(); ObjectMapper mapper = new ObjectMapper();