PowerJob之邮件报警配置

文档地址:点击这里


配置文件

spring.mail.host=smtp.163.com
spring.mail.username=becant223@163.com
# 这里不是邮箱密码,而是授权码,通过下面方式获取
spring.mail.password=xxxxxxxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

配置文件配置的是 发送邮件的邮箱

获取授权码

1.打开163邮箱官网,登录

2.点击顶部栏设置 —> POP3/SMTP/IMAP

3.开启 POP3/SMTP服务

报警用户录入

图片显示的邮件地址是 接收邮件的地址,(如果录入的是qq邮箱而且接收不到邮件,可以去垃圾箱看一看~~)

代码解析

1.单机执行

任务信息:

当任务执行失败时,经过一系列的方法,然后会进入processFinishedInstance()方法。

alert()方法

 
@Slf4j
@Service
@RequiredArgsConstructor
public class InstanceManager implements TransportServiceAware {

    // 构造注入
    private final AlarmCenter alarmCenter;
    
    private void alert(Long instanceId, String alertContent) {
        log.info("alert=--==-=--=-==-=--=-==--==-=--=-==--==-=-=-=-");
        // 根据instanceId获取任务运行日志表
        InstanceInfoDO instanceInfo = instanceInfoRepository.findByInstanceId(instanceId);
        // 任务信息表
        JobInfoDO jobInfo;
        try {
            // fetchJobInfoByInstanceId(instanceId):根据 instanceId 获取 JobInfo
            jobInfo = instanceMetadataService.fetchJobInfoByInstanceId(instanceId);
        } catch (Exception e) {
            log.warn("[InstanceManager-{}] can't find jobInfo, alarm failed.", instanceId);
            return;
        }
        // 获取任务执行失败告警对象
        JobInstanceAlarm content = new JobInstanceAlarm();
        // 设置信息
        BeanUtils.copyProperties(jobInfo, content);
        BeanUtils.copyProperties(instanceInfo, content);
        // fetchNotifyUserList(jobInfo.getNotifyUserIds()):根据用户ID字符串获取用户信息详细列表
        List<UserInfoDO> userList = SpringUtils.getBean(UserService.class).fetchNotifyUserList(jobInfo.getNotifyUserIds());
        if (!StringUtils.isEmpty(alertContent)) {
            content.setResult(alertContent);
        }
        alarmCenter.alarmFailed(content, AlarmUtils.convertUserInfoList2AlarmTargetList(userList));
    }

}

AlarmCenter类

@Slf4j
@Component
public class AlarmCenter {

    private final ExecutorService POOL;

    private final List<Alarmable> BEANS = Lists.newLinkedList();

    // 用于构造注入,参数为Alarmble的实现类(DingTalkAlarmService,MailAlarmService,WebHookAlarmService)
    public AlarmCenter(List<Alarmable> alarmables) {
        int cores = Runtime.getRuntime().availableProcessors();
        ThreadFactory factory = new ThreadFactoryBuilder().setNameFormat("AlarmPool-%d").build();
        POOL = new ThreadPoolExecutor(cores, cores, 5, TimeUnit.MINUTES, Queues.newLinkedBlockingQueue(), factory);

        alarmables.forEach(bean -> {
            BEANS.add(bean);
            log.info("[AlarmCenter] bean(className={},obj={}) register to AlarmCenter successfully!", bean.getClass().getName(), bean);
        });
    }
	
    public void alarmFailed(Alarm alarm, List<AlarmTarget> alarmTargets) {
        log.info("alarmFailed=--==-=--=-==-=--=-==--==-=--=-==--==-=-=-=-");
        // 录入警告信息时,只录入了邮件,而没有录入WebHook和钉钉
        // 故不会进入到DingTalkAlarmService.onFailed()和WebHookAlarmService.onFailed()
        // 只进入MailAlarmService.onFailed()
        POOL.execute(() -> BEANS.forEach(alarmable -> {
            try {
                log.info("alarmable:{}", alarmable);
                alarmable.onFailed(alarm, alarmTargets);
            }catch (Exception e) {
                log.warn("[AlarmCenter] alarm failed.", e);
            }
        }));
    }

}

MailAlarmService类

/**
 * 邮件通知服务
 *
 * @author tjq
 * @since 2020/4/30
 */
@Slf4j
@Service
public class MailAlarmService implements Alarmable {

    @Resource
    private Environment environment;

    private JavaMailSender javaMailSender;

    @Value("${spring.mail.username:''}")
    private String from;

    @Override
    public void onFailed(Alarm alarm, List<AlarmTarget> targetUserList) {
        log.info("onFailed=--==-=--=-==-=--=-==--==-=--=-==--==-=-=-=-");
        log.info("javaMailSender:{}", javaMailSender);
        if (CollectionUtils.isEmpty(targetUserList) || javaMailSender == null || StringUtils.isEmpty(from)) {
            return;
        }

        SimpleMailMessage sm = new SimpleMailMessage();
        try {
            sm.setFrom(from);
            sm.setTo(targetUserList.stream().map(AlarmTarget::getEmail).filter(Objects::nonNull).filter(email -> !email.isEmpty()).toArray(String[]::new));
            sm.setSubject(alarm.fetchTitle());
            sm.setText(alarm.fetchContent());

            javaMailSender.send(sm);
        }catch (Exception e) {
            log.warn("[MailAlarmService] send mail failed, reason is {}", e.getMessage());
        }
    }

    @Autowired(required = false)
    public void setJavaMailSender(JavaMailSender javaMailSender) {
        this.javaMailSender = javaMailSender;
    }

}

当任务失败后,控制台的输出:

往下滑~~~~

大致流程就是这样了~


PowerJob之邮件报警配置
http://example.com/2024/04/18/PowerJob之邮件报警配置/
发布于
2024年4月18日
更新于
2024年4月20日
许可协议