DolphinScheduler 版本
1.3.5版本,现在时间为2021年8月10 日。此时为次新版本
DolphinScheduler 服务
MasterServer ----- master服务
WorkerServer ----- worker服务
LoggerServer ----- logger服务
ApiApplicationServer ----- api服务
AlertServer ----- alert服务
程序入口
1、从官网下载源码后导入idea,更新maven后,可得到如下项目结构
2、dolphinscheduler-alert包下为告警模块服务,每个模块需要单独启动,找到main方法即找到alert服务入口,如下图
源码
创建AlertServer 实例对象,调用start方法,启动
public static void main(String[] args) {
AlertServer alertServer = AlertServer.getInstance();
alertServer.start();
}
start方法
- 改方通过while(true)循环方式,循环条件通过Stopper.isRunning()判断为TRUE或者FALSE,来实现循环
- Thread.sleep 循环体内通过线程每5秒启动一次
- 每次启动通过 alertDao.listWaitExecutionAlert()执行具体逻辑
public void start() {
logger.info("alert server ready start ");
while (Stopper.isRunning()) { //5秒循环
try {
Thread.sleep(Constants.ALERT_SCAN_INTERVAL); // 5000 ms
} catch (InterruptedException e) {
logger.error(e.getMessage(), e);
Thread.currentThread().interrupt();
}
List<Alert> alerts = alertDao.listWaitExecutionAlert(); // 扫描数据库中表 t_ds_alert 中 alert_status 字段为0等待发送,1成功,2失败 判断是否有需要发送的邮件 如果有
alertSender = new AlertSender(alerts, alertDao, alertPluginManager);
alertSender.run();
}
}
listWaitExecutionAlert方法
- listWaitExecutionAlert方法逻辑功能为通过定时
- 到dolphinscheduler配置数据库中执行如下sql
- t_ds_alert可以理解成告警信息相关表,在表中查找状态为等待发送的数据
List<Alert> alerts = alertDao.listWaitExecutionAlert();
//调用
public List<Alert> listWaitExecutionAlert(){
return alertMapper.listAlertByStatus(AlertStatus.WAIT_EXECUTION);
}
//调用
List<Alert> listAlertByStatus(@Param("alertStatus") AlertStatus alertStatus);
//底层执行sql为
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="org.apache.dolphinscheduler.dao.mapper.AlertMapper">
<select id="listAlertByStatus" resultType="org.apache.dolphinscheduler.dao.entity.Alert">
select *
from t_ds_alert
where alert_status = #{alertStatus}
</select>
</mapper>
alertSender.run()方法
- alertDao.listWaitExecutionAlert()方法会定时扫描出需要发送的数据,数据会逐条进行分析、发送
- alertDao.listUserByAlertgroupId(alert.getAlertGroupId())方法通过 t_ds_alert 表 alertgroup_id 去t_ds_user表中查找相应用户的email,即任务运行配置告警通知分组的用户获取email、与收件人的email
for (Alert alert : alertList) {
.......
}
public List<User> listUserByAlertgroupId(int alertgroupId){
return userAlertGroupMapper.listUserByAlertgroupId(alertgroupId);
}
emailPlugin.process(alertInfo)
- 处理类
- 判断收件人、告警组、抄送人的邮箱是否为空
- 满足条件,调用emailManager.send方法
emailManager.send
public Map<String,Object> send(List<String> receviersList,List<String> receviersCcList,String title,String content,String showType){
return MailUtils.sendMails(receviersList, receviersCcList, title, content, showType);
}
MailUtils.sendMails
邮件发送有四种类型
- 0 TABLE;表格
- 1 TEXT;
- 2 attachment;附件
- 3 TABLE+attachment;
通过页面配置,选择不同类型进行触发邮件发送